Меня попросили исследовать причину плохого выполнения запроса в нашей базе данных. Я решил, что он был сгенерирован оператором LINQ и отследил его до исходного кода и загрузил его в linqpad. В Linqpad я отобразил сгенерированный SQL, как показано ниже. Как вы можете видеть, первая часть предложения WHERE не нужна и значительно замедляет запрос, избегая индексов. Он должен просто запрашивать ключ DocumentStorageId, и все. В инструкции IN() нет смысла, каждая строка в таблице продуктов имеет одно из этих значений и не является нулевым. Любые идеи о том, как я могу изменить свой оператор linq, чтобы идентификатор был первым и попал в индексы?Почему этот запрос LINQ Framework Entity Framework генерирует медленное предложение where?
void Main()
{
var uow = new UnitOfWork(this);
var repo = new Repository<Product>(this,uow);
var documentStorageId = new Guid("473BAE6B-A1A1-49BE-9FD5-AB6B870A82B1");
var result = repo.Queryable()
.Where(x => x.DocumentStorageId == documentStorageId)
.FirstOrDefault();
result.Dump();
}
Сгенерированный SQL Выход:
SELECT
[Extent1].[AColumn],
[Extent1].[BColumn]
FROM [dbo].[Product] AS [Extent1]
WHERE
([Extent1].[ProductType] IN
(N'Type1',N'Type2',N'Type3',N'Type4',N'Type5',N'Type6'))
AND ([Extent1].[DocumentStorageId] = @p__linq__0)
EDIT: уточнить далее, модель создается с помощью Code First. Продукт является базовым классом. Существует 6 производных типов продукта (Type1, Type2 и т. Д.). ProductType - это столбец дискриминатора. Поэтому кажется, что EF пытается включить все возможные типы Продуктов, но зачем беспокоиться? Включение всех - это то же самое, что не указывать конкретный, а предложение IN() делает запрос медленным.
Я не уверен, почему 'IN' используется здесь только с базовым' .Where (x => x.Id == Id) 'use. Вы уверены, что нет каких-либо дополнительных ограничений? –
Да, я согласен с travis, это не вызвано кодом, который вы опубликовали, можете ли вы отправить свой код конфигурации модели и модели. –
@Travis Как я сказал в вопросе, когда я помещаю верхний оператор в LinqPad и нажимаю «Show Generated SQL», я получаю дно. Я ЗНАЮ, что это не имеет смысла и не является оптимальным, поэтому я публикую этот вопрос. – redwards510