Есть ли разница между вызовом функции 'where' в начале запроса и в конце с точки зрения производительности? - PullRequest
3 голосов
/ 23 сентября 2019

Извините, если это слишком очевидно, мне было интересно, есть ли разница между двумя блоками кода ниже с точки зрения производительности и количества извлеченных данных?будет ли указывать идентификатор в конце запроса (как в FirstOrDefaultAsync(b => b.BuyModelId == modelId)), сначала принесет все данные таблицы, а затем сравнит их с идентификатором?

и вызовет функцию Where в начале (например,этот Where(b => b.BuyModelId == modelId)) будет оценивать данные по идентификатору и затем вызывать включаемые функции?

Итак, чтобы подвести итог моего вопроса: существует ли определенный порядок выполнения этих операторов?

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

public async Task<BuyModel> GetModelById(int modelId)
{
    return await _applicationDbContext.BuyModels
         .Where(b => b.BuyModelId == modelId)
         .Include(b => b.Buyer)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.Category)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.SalesUser).FirstOrDefaultAsync();
}
public async Task<BuyModel> GetModelById(int modelId)
{
    return await _applicationDbContext.BuyModels
         .Include(b => b.Buyer)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.Category)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.SalesUser).FirstOrDefaultAsync(b => b.BuyModelId == modelId);
}

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Как сказано в комментариях, существует два уровня для выполнения запроса LINQ-to-entity.

Первый - это то, что генерируется SQL.В вашем сценарии я бы предположил, что они будут одинаковыми.Единственный способ убедиться, что EF выводит сгенерированный SQL.

Если сгенерированный SQL отличается, SQL все равно может создать тот же план выполнения.SQL-сервер обладает большим умом и волшебством, когда речь заходит об оптимизации запросов.Существует большая вероятность того, что оба запроса приведут к одному и тому же плану выполнения и, следовательно, к одинаковой производительности.

Но если вы действительно заботитесь о производительности, вам следует действительно проанализировать как сгенерированный запрос SQL, так и способ, которым SQL выполняет этот запрос.Желательно для полного и индексированного, чтобы план выполнения был реалистичным.

1 голос
/ 23 сентября 2019

Существует нулевая разница.До тех пор, пока запрашиваемый запрос не будет оценен (используя что-то вроде ToListAsync), все просто идет к созданию SQL-запроса, который будет в конечном итоге отправлен.

Тем не менее, последняя версия предпочтительнее, посколькуболее понятно, о чем вы спрашиваете.

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