SQL Serverクエリストア-「アドホック」クエリとは何ですか?


10

私はSQL Serverクエリストアについて詳しく調べており、「アドホック」クエリへの参照をよく目にします。ただし、クエリストアがアドホッククエリを決定する方法を確認していません。パラメータのないクエリまたは1回だけ実行されたクエリであると推測できる場所を見てきました。このための正式な定義はありますか?一般的な意味ではありません。つまり、クエリストアに関連しています。

例として、このページはクエリストアからアドホッククエリを削除する例を示していますが、使用している条件は実行カウントが1つしかないようです。これは、アドホッククエリの奇妙な定義のようです。ところで、ページに移動する場合は、「アドホッククエリの削除」を検索してください。



@SqlWorldWide-質問を書き直しました。一般的な意味ではありません。つまり、クエリストアに関連しています。
Randy Minder

クエリストアの構成方法-すべてまたは自動?
Kin Shah

@Kin-Autoに設定されています
Randy Minder

回答:


8

少し検索したところ、この質問に答えるためのMicrosoftのドキュメントから具体的で満足のいく情報源を見つけることができませんでした。アドホック/アドホック/アドホックの多くの優れたサードパーティの説明と定義がありますが、この質問の具体性のために、ソースに近いものが理想的だと思います。

このSOの投稿(SqlWorldWideに感謝)のような一般的な(しかしまだ正確な)定義を移動すると、このトピックに関するドキュメントの説明を見ると、実行回数に基づいた定義について述べたことと一致します。 、私はそれを事実と見なすことができるようになると思います。

アドホックワークフローの最適化に関する記事では、

このオプションが1に設定されている場合、データベースエンジンは、完全にコンパイルされたプランではなく、バッチが初めてコンパイルされるときに、コンパイルされた小さなプランスタブをプランキャッシュに格納します。これは、プランキャッシュが再利用されないコンパイル済みプランでいっぱいにならないようにすることで、メモリの負荷を軽減するのに役立ちます。コンパイルされたプランスタブにより、データベースエンジンはこのアドホックバッチが以前にコンパイルされたが、コンパイルされたプランスタブのみが格納されていることを認識できるため、このバッチが再度呼び出される(コンパイルまたは実行される)と、データベースエンジンはバッチをコンパイルします...完全にコンパイルされたプランをプランキャッシュに追加します。

したがって、アドホッククエリサーバーの構成オプションでも、アドホックの定義として単一の実行の定義を使用しているように見えます。クエリが引き続き実行され、同じプランを生成すると、そのようなものとして扱われなくなります。

クエリストアのベストプラクティスに関する記事もこれに対応しています。

個別のquery_hash値の数をsys.query_store_queryのエントリの総数と比較します。比率が1に近い場合、アドホックワークロードは異なるクエリを生成します。

もちろん、これは、ストアドプロシージャとしてまだ使用されていないクエリや、パラメータ化されたクエリなどを対象としています。

したがって、これらすべてに基づいて、クエリは次の場合にアドホックとして扱われると言えます。

  • パラメータ化されていません
  • プログラムでデータベースに格納されていない(ストアドプロシージャ、関数、トリガーなど)
  • 同じクエリが1回だけ実行される、または同じクエリが複数回実行されるが、その後の実行ごとに異なるクエリプランが生成される。

4

アドホッククエリの場合、sys.query_store_queryドキュメントに記載されているように、DMVのobject_id列はsys.query_store_query0になります

object_id

クエリが含まれるデータベースオブジェクトのID(ストアドプロシージャ、トリガー、CLR UDF / UDAggなど)。クエリがデータベースオブジェクトの一部として実行されない場合は0(アドホッククエリ)。

あなたは「これがあると、それが明示的に記述されていなくても、その値に基づいて、アドホッククエリを識別することができます定義アドホッククエリの」。:)


0

アドホックという用語は、一度だけ実行されたクエリを指すために使用されます。これは、データベース設定「アドホックワークロード用に最適化」で使用されている定義と一致しています。

アドホッククエリの削除に関して参照するリンクには、「アドホッククエリの削除:一度だけ実行され、24時間以上経過したクエリを削除する」という特定の定義が含まれています。


0

docs.microsoft.comのsys.dm_exec_cached_plans dmvのobjtype列からのアドホック。

アドホック:アドホッククエリ。リモートプロシージャコールとしてではなく、osqlまたはsqlcmdを使用して言語イベントとして送信されたTransact-SQLを指します。

この列の用途の1つは、複数のプランがあるクエリの場合に、複数のプランが原因であるかどうかを確認することです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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.