Bei der Verwendung von GETDATE() an vielen Orten, ist es besser, eine variable zu verwenden?
Besser, ich meine, verbessert es die Leistung von einigen nicht-marginale Menge?
Ist zu sagen, jedes mal, wenn ich rufe GETDATE()
, welche Menge Arbeit wird der server tun, um die Rückkehr Wert?
Wenn ich mit GETDATE()
in vielen Orten in eine gespeicherte Prozedur, sollte ich stattdessen erstellen Sie eine variable zum speichern des Datums der Transaktion?
declare @transDate datetime = GETDATE()
Bench-marking-Daten wäre fantastisch.
BEARBEITEN ich möchte klarstellen: ich bin interessiert, vor allem in der tatsächlichen performance-Unterschiede zwischen diesen beiden Möglichkeiten, und ob oder nicht es ist signifikant.
Leistungsunterschied wird sehr gering oder nicht existent. Den Unterschied würde ich besorgt sein, ist die Genauigkeit der Ergebnisse, wenn GETDATE() wird verwendet in Kontexten, in denen es re-evaluiert.
Danke für die Aufklärung für mich. Wie ich bereits erwähnte, ich bin interessiert, vor allem in der Leistung. Wenn Genauigkeit kritisch ist, dass die Verwendung einer Variablen ist ziemlich eindeutig die beste option.
Wann ist Genauigkeit nicht wichtig?
es gibt einen enormen performance-Unterschied, wenn queriing viele Zeilen finden Sie die akzeptierte Antwort unten, ist es auch genau das spiegelt unsere Beobachtungen.
ok, werde ich hier aufhören. Dies ist nicht über proofing, wenn ich es reproduzieren kann nichts, aber über die Hilfe für die OP. Meine Erfahrung in Bezug auf die Frage gesagt und es gibt genug gute Kommentare unten. Ich habe besseres zu tun, als eine Flamme-Krieg in den Kommentaren hier.
Danke für die Aufklärung für mich. Wie ich bereits erwähnte, ich bin interessiert, vor allem in der Leistung. Wenn Genauigkeit kritisch ist, dass die Verwendung einer Variablen ist ziemlich eindeutig die beste option.
Wann ist Genauigkeit nicht wichtig?
es gibt einen enormen performance-Unterschied, wenn queriing viele Zeilen finden Sie die akzeptierte Antwort unten, ist es auch genau das spiegelt unsere Beobachtungen.
ok, werde ich hier aufhören. Dies ist nicht über proofing, wenn ich es reproduzieren kann nichts, aber über die Hilfe für die OP. Meine Erfahrung in Bezug auf die Frage gesagt und es gibt genug gute Kommentare unten. Ich habe besseres zu tun, als eine Flamme-Krieg in den Kommentaren hier.
InformationsquelleAutor Shmiddty | 2012-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
[HINWEIS: Wenn Sie downvote beantworten, hinterlassen Sie bitte einen Kommentar zu erklären, warum. Es hat schon downvoted viele Male, und schließlich ypercube (danke) erklärt zumindest ein Grund warum. Ich kann nicht entfernen Sie die Antwort, weil es akzeptiert wird, so dass Sie könnte genauso gut helfen, es zu verbessern.]
Nach dem Wechsel auf Microsoft,
GETDATE()
aus geschaltet wird konstant innerhalb einer Abfrage zu nicht-deterministischen in SQL Server 2005. Im Nachhinein, glaube ich nicht, das ist korrekt. Ich denke, es war ein völlig nicht-deterministisch vor SQL Server 2005 und dann gehackt in etwas "nicht-deterministische Laufzeit Konstante", die seit SQL Server 2005". Der spätere Satz wirklich zu bedeuten scheint "Konstante innerhalb einer Abfrage".(Und
GETDATE()
definiert wird als eindeutig und stolz, nicht-deterministische, nicht-Qualifikanten.)Ach, in SQL Server werden nicht-deterministisch bedeutet nicht, dass eine Funktion ausgewertet wird, für jede Zeile. SQL Server wirklich macht dies unnötig kompliziert und mehrdeutig mit sehr wenig Dokumentation zu dem Thema.
In der Praxis der Aufruf der Funktion ausgewertet wird, wenn die Abfrage ausgeführt wird, statt einmal, wenn die Abfrage kompiliert und sein Wert ändert sich jedes mal, wenn es aufgerufen wird. In der Praxis
GETDATE()
wird nur einmal ausgewertet, für jeden Ausdruck, wo es verwendet wird -- bei Ausführungszeit eher als compile-Zeit. Aber Microsoft stelltrand()
undgetdate()
in eine spezielle Kategorie, die als nicht-deterministische Laufzeit Konstante Funktionen. Durch Kontrast, Postgres nicht springen durch solche Reifen, es ruft nur Funktionen, die einen Konstanten Wert ausgeführt, wenn Sie als "stabil".Trotz Martin Smith kommentieren, SQL-Server-Dokumentation ist einfach nicht eindeutig zu dieser Frage --
GETDATE()
wird beschrieben, wie sowohl "deterministische" und "nicht-deterministische Laufzeit-Konstante", aber dieser Begriff ist nicht wirklich erklärt. Der einzige Ort, den ich gefunden habe, der Begriff , für etwa die nächsten Zeilen in der Dokumentation sagen, nicht zu verwenden, nicht deterministische Funktionen in Unterabfragen unterstützt. Das wäre blöd Beratung für die "nicht deterministische Laufzeit konstant".Ich würde vorschlagen, mit der eine variable mit einer Konstanten auch innerhalb einer Abfrage, so dass Sie einen konsistenten Wert. Dies macht auch die intention deutlich:
Sie möchten einen einzelnen Wert innerhalb der Abfrage. Innerhalb einer einzigen Abfrage, die Sie tun können, so etwas wie:
Eigentlich ist dies ein Hinweis, dass sollte bewerten nur einmal in der Abfrage, aber es könnte Ausnahmen geben. Verwirrung entsteht, weil
getdate()
gibt den gleichen Wert auf alle anderen Zeilen-aber es kann zurückkehren, verschiedene Werte in verschiedene Spalten. Jeder Ausdruck mitgetdate()
unabhängig evaluiert.Dies ist offensichtlich, wenn Sie ausführen:
Innerhalb einer gespeicherten Prozedur, die Sie möchten, um einen einzelnen Wert in eine variable. Was passiert, wenn die gespeicherte Prozedur ausgeführt, die als Mitternacht vorbei, und das Datum wechselt? Was bedeutet das für die Ergebnisse?
Als für Leistung, meine Vermutung ist, dass die Datum/Zeit-lookup ist minimal und für eine Abfrage erfolgt einmal pro Ausdruck als Abfrage zu laufen beginnt. Dies sollte nicht wirklich ein performance-Problem, sondern eher ein code-Konsistenz-Problem.
GETDATE()
war nie deterministisch. Deterministisch bedeutet, dass es immer das gleiche Ergebnis zurückgeben, wenn Sie übergeben die gleichen Parameter. Siehe die Liste der deterministischen Funktionen im Jahr 2000.GETDATE
ist ein Laufzeit Konstante Funktion. Eine einzelneGETDATE()
- Aufruf wird nicht wieder zu einem anderen Ergebnis pro Zeile unabhängig von der Länge der query-Ausführung wenn Sie können, wickeln Sie Sie in eine UDF um diesen Effekt zu bekommen.Verschiedene
GETDATE()
Verweise in der gleichen Abfrage kann andere Ergebnisse zurückgebenWHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 PRINT 'This will not run in an infinite loop'
nicht ausführen in eine Endlosschleife, in 2000/2005/2008.Es besorgt mich, dass diese akzeptiert und hoch von Ihnen positiv bewertet werden Antwort scheint falsch zu sein, während die Kommentar von Marthin Smith scheint richtig zu sein.
href="http://dba.stackexchange.com/questions/18459/does-sql-server-evaluate-functions-once-for-every-row" Titel="sql-server-bewerten-Funktionen einmal für jede Zeile,">dba.stackexchange.com/questions/18459/...
InformationsquelleAutor Gordon Linoff
Mein Vorschlag wäre, eine variable zu verwenden, vor allem, weil, wenn Sie haben ein langer Prozess, der
GetDate()
Wert hat, können unterschiedlich sein zwischen den anrufen.Es sei denn, Sie sind nur mit der
Date
TeilGetDate()
dann werden Sie sicher, dass Sie immer mit dem gleichen Wert.GETUTCDATE()
), wo immer möglich. Es ist ein kleines bisschen schneller, und hilft Ihnen, vermeiden eine Menge Zeit-Fragen.+1 für den Hinweis auf mögliche Veränderung der
GETDATE()
Ich glaube nicht, dass Sie sich verlassen können, bekommen den Teil des Datums, denn Sie können starten Sie die Abfrage, um 11:59pm, die möglicherweise Spanne für 10 Minuten und erhalten Sie ein anderes Datum um 12:01 am nächsten Tag.
Aber in dem Fall, dass es nicht entscheidend ist, dass jede Instanz von
GetDate()
Gegenzug den gleichen Wert, gibt es andere Vorteile der Verwendung einer Variablen?das ist sehr wahr, gut, würde ich immer eine variable zu verwenden, die in dieser Art von Fall. Viel besser, als Sie mehrere Anrufe.
InformationsquelleAutor Taryn
Einen Grund für die Verwendung einer variable mit getdate() oder Funktionen wie suser_sname() ist ein riesiger performance-Unterschied, wenn Sie Zeilen einfügen, oder wenn Sie eine GRUPPE VON. Sie werden dies feststellen, wenn Sie große Menge von Zeilen.
Litt ich selbst migrieren 300GB an Daten auf mehrere Tabellen.
InformationsquelleAutor MarianoC
War ich den Test auf einem paar von gespeicherten Prozeduren unter Verwendung der GETDATE () - Funktion als eine variable innerhalb der SP, und ich hatte erhöht auf IO lese-und Ausführungszeit aufgrund der Tatsache, dass der Abfrage-Optimierer nicht wissen, was der Wert zu betreiben, Lesen Sie diese Ausführung einer gespeicherten Prozedur mit Parametern, Variablen und Literale , mit dieser sagte können Sie die GETDATE () - Funktion in jedem einzelnen Teil die SP @Gordon Linoff erwähnt sein Wert ändert sich nicht während der Ausführung oder um zu vermeiden/entfernen, die denken, dass der Wert ändern kann, habe ich erstellen Sie einen Parameter auf diese Weise:
.....
und verwenden Sie dann die Parameter wie Sie sehen, passen, werden Sie sehen, gute Ergebnisse
Irgendwelche Kommentare oder Vorschläge sind willkommen.
InformationsquelleAutor jthalliens
Ich verwendet
in Kombination mit der Funktion unten. Brachte meine Abfrage in der Zeit von 13 Sekunden, zu 2 Sekunden. Keine der vorherigen Antworten in diesem Beitrag geholfen, dieses problem in SQL 2008/R2.
InformationsquelleAutor pghcpa