SQL Server-Abfragespeicher - Was wird als Ad-hoc-Abfrage angesehen?

10

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".

Randy Minder
quelle
@SqlWorldWide - Ich habe meine Frage umformuliert. Ich meine im Allgemeinen nicht. Ich meine, wie es sich auf den Query Store bezieht.
Randy Minder
Wie ist Ihr Abfragespeicher konfiguriert - alle oder automatisch?
Kin Shah
@ Kin - Es ist als Auto
Randy Minder

Antworten:

8

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.
LowlyDBA
quelle
4

Bei Ad-hoc-Abfragen lautet die Spalte object_id in der sys.query_store_queryDMV 0, wie in der Dokumentation zu sys.query_store_query angegeben :

object_id :

ID des Datenbankobjekts, zu dem die Abfrage gehört (gespeicherte Prozedur, Trigger, CLR UDF / UDAgg usw.). 0, wenn die Abfrage nicht als Teil eines Datenbankobjekts ausgeführt wird (Ad-hoc-Abfrage).

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. :) :)

Rigerta Demiri
quelle
0

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."

Matthew McGiffen
quelle
0

Ad-hoc aus der Spalte sys.dm_exec_cached_plans dmv objtypein docs.microsoft.com.

Ad-hoc: Ad-hoc-Abfrage. Bezieht sich auf Transact-SQL, das als Sprachereignisse unter Verwendung von osql oder sqlcmd anstelle von Remoteprozeduraufrufen übermittelt wird.

Eine Verwendung dieser Spalte besteht darin, bei Abfragen mit mehreren Plänen festzustellen, ob die mehreren Pläne durch verursacht werden Adhoc.

    SELECT  DISTINCT 
        QCP.objtype
        ,MultipleQ.PlanCount
        ,qStat.query_hash
        ,sText.text AS QueryText
FROM ( 
        SELECT query_hash,
               COUNT(query_hash) AS PlanCount
        FROM sys.dm_exec_query_stats
        GROUP BY query_hash
    ) AS MultipleQ
INNER JOIN sys.dm_exec_query_stats qStat ON MultipleQ.query_hash = qStat.query_hash
INNER JOIN sys.dm_exec_cached_plans  QCP
    ON QCP.plan_handle = qStat.plan_handle
CROSS APPLY sys.dm_exec_sql_text(qStat.sql_handle) AS sText
CROSS APPLY sys.dm_exec_query_plan(qStat.plan_handle) AS qp
WHERE PlanCount > 1
ORDER BY MultipleQ.PlanCount DESC
LCJ
quelle