Я столкнулся с проблемой, когда EF создавал ужасные запросы при поиске в поле строки. Он создал запрос в стиле ленивых программистов для включения проверки нуля, который заставляет сканировать весь индекс.
рассмотрим следующие запросы.
-
Запрос 1
var p1 = "x"; var r1 = ctx.Set<E>().FirstOrDefault( subject => p1.Equals(subject.StringField));
-
Запрос 2
const string p2 = "x"; var r2 = ctx.Set<E>().FirstOrDefault( subject => p2.Equals(subject.StringField));
Запрос 1 производит
WHERE (('x' = [Extent2].[StringField]) OR (('x' IS NULL) AND ([Extent2].[StringField] IS NULL)))
и выполняется за 4 секунды
Запрос 2 производит
WHERE (N'x' = [Extent2].[StringField])
и выполняется за 2 миллисекунды
Кто-нибудь знает о какой-либо работе? (параметр не может быть const, поскольку он вводится пользователем, но не может быть нулевым.)
N.B При профилировании оба запроса подготовлены с помощью sp_executesql по EF; если они были только что выполнены, оптимизатор запросов будет отрицать проверку OR 'x' IS NULL.