Entity Framework: несколько запросов против внутренних объединений - PullRequest
2 голосов
/ 03 июня 2019

В настоящее время я работаю с Entity Framework, и у меня есть вопрос производительности относительно внутренних объединений.

Какой из следующих 2 случаев лучше всего основывается на производительности в целом?

По соображениям простоты этого примера предположим, что для братьев и сестер существует отношение 1: 1.

(1) Внутренние соединения:

EFContext context = new EFContext();

int myId = GetMyOwnId();

Person me = context.People
                   .Include(p => p.Father)
                   .Include(p => p.Mother)
                   .Include(p => p.Brother)
                   .Include(p => p.Sister)
                   .Where(p => p.ID == myId);

return me;

(2) Необязательные множественные запросы:

EFContext context = new EFContext();

int myId = GetMyOwnId();

Person me = context.People
                   .Where(p => p.ID == myId);

if (me.FatherId.HasValue) 
    me.Father = context.People.Find(me.FatherId);

if (me.MotherId.HasValue) 
    me.Mother = context.People.Find(me.MotherId);

if (me.BrotherId.HasValue) 
    me.Brother = context.People.Find(me.BrotherId);

if (me.SisterId.HasValue) 
    me.Sister = context.People.Find(me.SisterId);

return me;

Так, какой случай лучше для каждой ситуации?

Или один лучше другого для людей без семьи или для людей с отцом, матерью, братом и сестрой?

1 Ответ

3 голосов
/ 03 июня 2019

Опция (1) всегда должна быть лучше, так как JOIN выполняется на уровне базы данных.Как правило, вы можете сказать, что собственные проверки базы данных выполняются быстрее, чем проверки кода, и несколько циклов обработки между базой данных и кодом всегда медленнее, чем одна.Так как база данных в любом случае будет неявно выполнять проверку на наличие пустого идентификатора в соединении, нет необходимости делать это в коде и добавлять для этого возможные дополнительные обходы.Кроме того, база данных сможет автоматически оптимизировать план выполнения, если она знает, в чем заключается цель запроса, это может обеспечить еще одно повышение производительности, особенно если ограничения установлены правильно и / или запрос выполняется часто.

Может быть, кто-то может добавить эталон для этого, чтобы быть на 100% уверенным, но с чисто логической точки зрения это должно быть правильно, если ничего странного не происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...