Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

OPTION (RECOMPILE) ist immer schneller; Wieso den?

Es gibt Zeiten, in denen OPTION(RECOMPILE) verwendet wird macht Sinn. Meiner Erfahrung nach ist dies nur dann eine praktikable Option, wenn Sie dynamisches SQL verwenden. Bevor Sie untersuchen, ob dies in Ihrer Situation sinnvoll ist, würde ich empfehlen, Ihre Statistiken neu zu erstellen. Führen Sie dazu Folgendes aus:

EXEC sp_updatestats

Und dann Ihren Ausführungsplan neu erstellen. Dadurch wird sichergestellt, dass bei der Erstellung Ihres Ausführungsplans die neuesten Informationen verwendet werden.

Hinzufügen von OPTION(RECOMPILE) erstellt den Ausführungsplan jedes Mal neu, wenn Ihre Abfrage ausgeführt wird. Ich habe noch nie gehört, dass dies so beschrieben wird, dass creates a new lookup strategy aber vielleicht verwenden wir nur unterschiedliche Begriffe für dieselbe Sache.

Wenn eine gespeicherte Prozedur erstellt wird (ich vermute, Sie rufen Ad-hoc-SQL von .NET aus auf, aber wenn Sie eine parametrisierte Abfrage verwenden, ist dies letztendlich ein Aufruf einer gespeicherten Prozedur), versucht SQL Server, den effektivsten Ausführungsplan für diese Abfrage zu ermitteln basierend auf den Daten in Ihrer Datenbank und den übergebenen Parametern (Parameter-Sniffing) und speichert diesen Plan dann im Cache. Das bedeutet, wenn Sie die Abfrage mit 10 Datensätzen in Ihrer Datenbank erstellen und sie dann ausführen, wenn 100.000.000 Datensätze vorhanden sind, ist der zwischengespeicherte Ausführungsplan möglicherweise nicht mehr der effektivste.

Zusammenfassend - ich sehe keinen Grund dafür, dass OPTION(RECOMPILE) wäre hier von Vorteil. Ich vermute, Sie müssen nur Ihre Statistiken und Ihren Ausführungsplan aktualisieren. Je nach Situation kann die Neuerstellung von Statistiken ein wesentlicher Bestandteil der DBA-Arbeit sein. Wenn Sie nach dem Aktualisieren Ihrer Statistiken immer noch Probleme haben, würde ich vorschlagen, beide Ausführungspläne zu veröffentlichen.

Und um Ihre Frage zu beantworten:Ja, ich würde sagen, es ist höchst ungewöhnlich, dass Sie den Ausführungsplan jedes Mal neu kompilieren, wenn Sie die Abfrage ausführen.