arbeite ich einige Abfragen auf die Optimierung und lief in eine Kuriosität, dass ich nicht sicher bin, wie zu erklären. Verwenden von SQL Server 2012 mit dem folgenden Code:TSQL: Statische Variablen vs. Berechnungen in where-Klauseln
DECLARE @startdate DATETIME2 = DATEADD(day,-1,GETDATE()),
@enddate DATETIME2 = GETDATE()
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN DATEADD(day,-1,GETDATE()) AND GETDATE()
AND somestate = 'NV'
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN @startdate AND @enddate
AND somestate = 'NV'
Mit Blick auf dem tatsächlichen Ausführungsplan, hat die erste Auswahl ein Index suchen und einen Schlüsselsuche, wobei die zweiten einen Clustered-Index Scan hat. Da die SELECT
s von einem funktionalen Zweck im Wesentlichen identisch sind, war ich nicht sicher, warum es den Unterschied in Ausführungsplänen geben würde. Mein letzter DBA hatte mir gesagt, dass das Deklarieren von Variablen mit dem Wert in WHERE
Klauseln zu verwenden, war besser als in der WHERE
Klausel, um die Berechnungen zu haben, aber dies scheint gegen diese Aussage anzuzeigen. Ich hoffe auf jede Klärung, was die große Diskrepanz zwischen den beiden Aussagen verursacht. Ich habe versucht, nach Antworten zu suchen, hatte aber nicht viel Glück. Wenn mir jemand in die richtige Richtung zeigen könnte, wäre ich sehr dankbar.
Vielen Dank!
Set [Bad Habits zu treten - NOLOCK überall setzen] (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - es ist * nicht dies überall empfohlen * verwenden - ganz im Gegenteil! –
ich im zweiten Fall denke, die SQL Server nicht bewusst ist, dass startdate und enddate verbunden sind, erwartet er alle Werte, so Scan er wählen (man denke abgesehen von Terminen Jahre). –