EF жестко закодированное значение в предложении WHERE быстрое, строковый параметр медленный - PullRequest
1 голос
/ 15 октября 2019

Я испытываю очень низкую производительность, когда я задаю строковую переменную в своем предложении EF Where, и очень высокую производительность, когда я жестко кодирую строковое значение в предложении where.

C #, .Net Framework 4.7. 1, EF 6,2

50 мс

db.Dealers.Where(x => x.SourceDealerId == "000111222fff333q");

1,5 секунды

var parameter = "000111222fff333q";
db.Dealers.Where(x => x.SourceDealerId== parameter );

Дилер типа идентификатора Char (18) в базе данных, и это обнуляется. Подход сначала баз данных. Вот свойства столбца дилера: enter image description here

Существует разница в SQL, который генерируется в обоих случаях. Для быстрого случая: ... WHERE dealerId = '000111222fff333q'

Для быстрого случая:

enter image description here

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Это может быть связано с настройкой сравнения NULL в Entity Framework.

добавьте следующий код перед запросом, чтобы проверить, помогает ли он в выполнении запроса:

context.ContextOptions.UseCSharpNullComparisonBehavior = false;
1 голос
/ 15 октября 2019

Как вы можете видеть, когда вы используете параметр, EF добавляет проверку нулевого сравнения, чтобы имитировать поведение нулевого сравнения в C #. В то время как в C # null == null - это True, в SQL NULL = NULL - в False. В зависимости от размера вашей таблицы это может повлиять на вашу производительность.

У вас есть два варианта:

  1. На мой взгляд, предпочтительнее добавить индекс в таблицу длястолбец SourceDealerID. Обратите внимание, что индекс влияет на производительность для обновлений и вставок, поэтому вам следует проверить это.
  2. Отключите проверку NULL и помните, что ваш запрос LINQ ведет себя как SQL, а не как C #. Это можно сделать, установив UseDatabaseNullSemantics в true.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...