Entity Framework Core 8 Где IN и Где IN OPENJSONC#

Место общения программистов C#
Ответить
Anonymous
 Entity Framework Core 8 Где IN и Где IN OPENJSON

Сообщение Anonymous »

EF Core 8 теперь встраивает значения в операторыwhere, используя комбинацию WHERE IN и OPENJSON в отличие от предыдущей WHERE IN(...).Это изменение отмечено в документации и указанная причина следующая:

Встраивание значений здесь выполнено таким образом что нет
вероятности атаки SQL-инъекцией. Изменение использования JSON, описанное
ниже, касается производительности и не имеет ничего общего с безопасностью.

К сожалению, производительность OPENJSON на нашем экземпляре SQL Server 2017 года.
Приведенный ниже запрос, созданный EF Core 8, выполняется 1,8 секунды и дает почти 400 000 читает:

Код: Выделить всё

DECLARE @__scheduleTagIds_0 nvarchar(4000) = N'[5835,5970,6563,6564,6565,6645,6835,6850,7034,7127]';

SELECT  [s].[ScheduleTagId]
,[s].[MustStartProdBy]
FROM    [ScheduleTagMustStartBy] AS [s]
WHERE   [s].[ScheduleTagId] IN (
SELECT  [s0].[value]
FROM    OPENJSON(@__scheduleTagIds_0) WITH ([value] int '$') AS [s0]
)
Если я реорганизую запрос, чтобы использовать стандартный WHERE IN(...), время выполнения упадет до 120 мс и 29 000 читает:

Код: Выделить всё

SELECT  [s].[ScheduleTagId]
,[s].[MustStartProdBy]
FROM    [ScheduleTagMustStartBy] AS [s]
WHERE   [s].[ScheduleTagId] IN (5835,5970,6563,6564,6565,6645,6835,6850,7034,7127)
В моем приложении есть сотни запросов, которые используют .Where(x => [collection].Contains(x.Id)), и меня очень беспокоит снижение производительности, которое я наблюдаю в некоторых запросах.
Вопрос
Что я могу сделать, чтобы устранить эту проблему? Я открыт для вариантов как в EF, так и на стороне SQL Server (хотя я не хочу менять уровень совместимости базы данных).

Подробнее здесь: https://stackoverflow.com/questions/777 ... n-openjson
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»