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:
Wenn diese Option auf 1 gesetzt ist, speichert das Datenbankmodul beim ersten Kompilieren eines Stapels anstelle des vollständig kompilierten Plans einen kleinen kompilierten Planstub im Plan-Cache. Dies hilft, den Speicherdruck zu verringern, indem der Plan-Cache nicht mit kompilierten Plänen gefüllt wird, die nicht wiederverwendet werden. Mit dem kompilierten Plan-Stub kann das Datenbankmodul erkennen, dass dieser Ad-hoc-Stapel zuvor kompiliert wurde, aber nur einen kompilierten Plan-Stub gespeichert hat. Wenn dieser Stapel also erneut aufgerufen (kompiliert oder ausgeführt) wird, kompiliert das Datenbankmodul den Stapel ... und fügt den vollständig kompilierten Plan dem Plan-Cache hinzu.
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:
Vergleichen Sie die Anzahl der unterschiedlichen query_hash-Werte mit der Gesamtzahl der Einträge in sys.query_store_query. Wenn das Verhältnis nahe 1 liegt, generiert Ihre Ad-hoc-Arbeitslast unterschiedliche Abfragen.
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:
- Es ist nicht parametriert
- Es wird nicht programmgesteuert in der Datenbank gespeichert (gespeicherter Prozess, Funktion, Trigger usw.)
- Dieselbe Abfrage wird nur einmal ausgeführt ODER dieselbe Abfrage wird mehrmals ausgeführt, generiert jedoch für jede nachfolgende Ausführung einen anderen Abfrageplan.