Ich habe mich intensiv mit dem SQL Server-Abfragespeicher befasst und sehe häufig Verweise auf Ad-hoc-Abfragen. Ich habe jedoch nicht gesehen, wie der Abfragespeicher eine Ad-hoc-Abfrage bestimmt. Ich habe Stellen gesehen, an denen davon ausgegangen werden kann, dass es sich um eine Abfrage ohne Parameter oder eine Abfrage handelt, die nur einmal ausgeführt wird. Gibt es dafür eine formale Definition? Ich meine im Allgemeinen nicht. Ich meine, wie es sich auf den Query Store bezieht.
Auf dieser Seite wird beispielsweise ein Beispiel für das Entfernen von Ad-hoc-Abfragen aus dem Abfragespeicher gezeigt. Es wird jedoch anscheinend nur eine Ausführungsanzahl von Kriterien verwendet. Dies scheint eine seltsame Definition einer Ad-hoc-Abfrage zu sein. Übrigens, wenn Sie zur Seite gehen, suchen Sie nach "Ad-hoc-Abfragen löschen".
quelle
Antworten:
Nach einigem Suchen konnte ich keine konkrete und zufriedenstellende Quelle aus der Microsoft-Dokumentation finden, um diese Frage zu beantworten. Es gibt viele gute Beschreibungen und Definitionen von Ad-hoc / Ad-hoc / Ad-hoc von Drittanbietern, aber für die Spezifität dieser Frage halte ich eine in der Nähe der Quelle für ideal.
Wenn wir uns über generische (aber immer noch genaue) Definitionen wie diesen SO-Beitrag hinwegbewegen (danke SqlWorldWide), wenn wir uns ansehen, was die Dokumentation zu diesem Thema sagt, stimmt dies mit dem überein, was Sie über die Definition basierend auf der Anzahl der Ausführungen erwähnt haben Ich denke bis zu dem Punkt, dass wir es als Tatsache betrachten können.
Der Artikel zur Optimierung für Ad-hoc-Workflows lautet:
Es scheint also, dass die Konfigurationsoption des Ad-hoc-Abfrageservers auch die Definition einer einzelnen Ausführung als Definition von Ad-hoc verwendet. Wenn die Abfrage weiterhin ausgeführt wird und denselben Plan generiert, wird sie nicht mehr als solche behandelt.
Der Artikel über Best Practices für den Abfragespeicher stimmt ebenfalls damit überein:
Dies gilt natürlich für Abfragen, die noch nicht als gespeicherte Prozeduren, Parameter usw. verwendet wurden, da sie sofort erkannt und entsprechend behandelt werden können.
Aufgrund all dessen können wir also sagen, dass eine Abfrage als Ad-hoc behandelt wird, wenn:
quelle
Bei Ad-hoc-Abfragen lautet die Spalte object_id in der
sys.query_store_query
DMV 0, wie in der Dokumentation zu sys.query_store_query angegeben :Sie können Ad-hoc-Abfragen anhand dieses Werts identifizieren, obwohl dies nicht ausdrücklich als "Dies ist die Definition von Ad-hoc-Abfragen " angegeben wird. :) :)
quelle
Der Begriff Ad-hoc bezieht sich auf Abfragen, die nur einmal ausgeführt wurden. Dies steht im Einklang mit der Definition für die Datenbankeinstellung "Für Ad-hoc-Workloads optimieren".
Der Link, auf den Sie beim Löschen von Ad-hoc-Abfragen verweisen, enthält diese spezifische Definition "Ad-hoc-Abfragen löschen: Hiermit werden die Abfragen gelöscht, die nur einmal ausgeführt wurden und älter als 24 Stunden sind."
quelle
Ad-hoc aus der Spalte sys.dm_exec_cached_plans dmv
objtype
in docs.microsoft.com.Eine Verwendung dieser Spalte besteht darin, bei Abfragen mit mehreren Plänen festzustellen, ob die mehreren Pläne durch verursacht werden
Adhoc
.quelle