Entity Framework Core 8 Where IN vs Where IN OPENJSONC#

Ein Treffpunkt für C#-Programmierer
Guest
 Entity Framework Core 8 Where IN vs Where IN OPENJSON

Post by Guest »

EF Core 8 fügt jetzt Werte in where-Anweisungen mithilfe einer Kombination aus WHERE IN und OPENJSON ein, im Gegensatz zum vorherigen WHERE IN(...).Diese Änderung wird in der Dokumentation vermerkt und der angegebene Grund lautet wie folgt:

Das Inlining von Werten erfolgt hier auf diese Weise dass keine Gefahr eines SQL-Injection-Angriffs besteht. Bei der unten beschriebenen Änderung zur Verwendung von JSON geht es ausschließlich um Leistung und nicht um Sicherheit.

Leider ist die Leistung von OPENJSON auf unserer 2017 SQL Server-Instanz ist schlecht.
Die Ausführung der folgenden Abfrage, die von EF Core 8 generiert wird, dauert 1,8 Sekunden und ergibt fast 400.000 lautet:

Code: Select all

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]
)
Wenn ich die Abfrage umgestalte, um ein Standard-WHERE IN(...) zu verwenden, sinkt die Ausführungszeit auf 120 ms und 29.000 lautet:

Code: Select all

SELECT  [s].[ScheduleTagId]
,[s].[MustStartProdBy]
FROM    [ScheduleTagMustStartBy] AS [s]
WHERE   [s].[ScheduleTagId] IN (5835,5970,6563,6564,6565,6645,6835,6850,7034,7127)
Ich habe Hunderte von Abfragen in meiner Anwendung, die .Where(x => [collection].Contains(x.Id)) verwenden, und ich mache mir große Sorgen darüber Bei ausgewählten Abfragen sehe ich Leistungseinbußen.
Frage
Was kann ich tun, um dieses Problem zu beheben? Ich bin offen für Optionen entweder in EF oder auf der SQL Server-Seite (möchte jedoch den Kompatibilitätsgrad der Datenbank nicht ändern).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post