Optimierung von dateTime in der linq-Abfrage

9

Hallo Leute, ich stehe vor einem Leistungsproblem.
Wenn ich diese Abfrage mit dateTime innerhalb der Abfrage

deklariert %Vor%

In sql Server Profiler ist es in diese Abfrage übersetzt

%Vor%

Und es funktioniert gut, es wird unter 1s ausgeführt Jetzt, wenn ich DateTime außerhalb der Abfrage deklariere und ich diese Abfrage ausführen

%Vor%

In sql Server Profiler ist es in diese Abfrage übersetzt

%Vor%


Was etwa 5 Minuten benötigt, um den ganzen Unterschied aufgrund der DateTime-Deklaration zu erhalten, muss ich wissen, welche Änderungen ich machen sollte, um die DateTime-outisde-Abfrage zu deklarieren und dieselbe Leistung wie die erste Abfrage zu erhalten.

    
drex drex 16.04.2015, 08:32
quelle

4 Antworten

1

Ich nehme an, Sie haben viele Zeilen in Ihrer Tabelle und der Wert 2015-01-01 00:00:00 bietet genug Filter, um viele Zeilen zu verwerfen (sagen wir 8 von 10), und es lohnt sich, den entsprechenden Index zu verwenden.

Mit der Variablen weiß der Abfrageoptimierer nicht, ob die Variable im Vergleich zu einem einfachen Tabellenscan genügend Filterung bietet. Es könnte beurteilen, dass es nicht sinnvoll ist, den Index zu verwenden (insbesondere, wenn der Index eine INCLUDE-Klausel enthält, die für die Abfrage nicht relevant ist. Laut Ihrer vorherigen Frage könnte dies der Fall sein

Es hat möglicherweise auch einen fehlerhaften Abfrageplan wegen "parameter sniffing"

erzeugt

Wie auch immer, Sie können versuchen, ein erzwungenes "OPTION RECOMPILE" mit einem dedizierten Abfrage-Interceptor einzuführen. Sehen Ссылка

    
jbl 16.04.2015 15:43
quelle
0

Der Grund dafür (glaube ich) ist, dass im ersten Szenario die DateTime eine Kompilierzeitkonstante ist, in der zweiten jedoch nicht, und deshalb muss EF sie als Parameter übergeben.

    
Ryan Amies 16.04.2015 13:26
quelle
0

Meine Vermutung ist, dass der SQL-Compiler mit dem konstanten Wert weiß, wie man den effizientesten Plan erstellt, aber mit einem Parameter nicht, also muss er raten, jeder mag schlecht raten. Da die erste Abfrage nur 50 Datensätze zurückgibt und noch fast eine Minute dauert, denke ich, dass das Hinzufügen von Indizes (oder Neuindexierung, falls Indizes bereits existieren) auf [date_reception] und [mc_object] helfen sollte. Wenn diese nicht funktionieren, müssen Sie möglicherweise SQL manuell erstellen, anstatt Linq zu verwenden, da Sie nicht viel Kontrolle über die von Linq generierte SQL haben.

    
D Stanley 16.04.2015 15:12
quelle
0

Versuchen Sie, den Unterschied in den Ausführungsplänen herauszufinden. In diesem Experiment unterscheidet sich dies aufgrund der Tatsache, dass die Spalte als datetime deklariert ist und der comparand anders deklariert ist. In einem Fall ist es eine Inline-Anweisung und in der anderen eine deklarierte Variable. Wenn Sie das Feld als datetime2 deklarieren, gibt es keinen Unterschied im Ausführungsplan.

    
George Polevoy 12.05.2015 19:25
quelle