少し検索したところ、この質問に答えるためのMicrosoftのドキュメントから具体的で満足のいく情報源を見つけることができませんでした。アドホック/アドホック/アドホックの多くの優れたサードパーティの説明と定義がありますが、この質問の具体性のために、ソースに近いものが理想的だと思います。
このSOの投稿(SqlWorldWideに感謝)のような一般的な(しかしまだ正確な)定義を移動すると、このトピックに関するドキュメントの説明を見ると、実行回数に基づいた定義について述べたことと一致します。 、私はそれを事実と見なすことができるようになると思います。
アドホックワークフローの最適化に関する記事では、
このオプションが1に設定されている場合、データベースエンジンは、完全にコンパイルされたプランではなく、バッチが初めてコンパイルされるときに、コンパイルされた小さなプランスタブをプランキャッシュに格納します。これは、プランキャッシュが再利用されないコンパイル済みプランでいっぱいにならないようにすることで、メモリの負荷を軽減するのに役立ちます。コンパイルされたプランスタブにより、データベースエンジンはこのアドホックバッチが以前にコンパイルされたが、コンパイルされたプランスタブのみが格納されていることを認識できるため、このバッチが再度呼び出される(コンパイルまたは実行される)と、データベースエンジンはバッチをコンパイルします...完全にコンパイルされたプランをプランキャッシュに追加します。
したがって、アドホッククエリサーバーの構成オプションでも、アドホックの定義として単一の実行の定義を使用しているように見えます。クエリが引き続き実行され、同じプランを生成すると、そのようなものとして扱われなくなります。
クエリストアのベストプラクティスに関する記事もこれに対応しています。
個別のquery_hash値の数をsys.query_store_queryのエントリの総数と比較します。比率が1に近い場合、アドホックワークロードは異なるクエリを生成します。
もちろん、これは、ストアドプロシージャとしてまだ使用されていないクエリや、パラメータ化されたクエリなどを対象としています。
したがって、これらすべてに基づいて、クエリは次の場合にアドホックとして扱われると言えます。
- パラメータ化されていません
- プログラムでデータベースに格納されていない(ストアドプロシージャ、関数、トリガーなど)
- 同じクエリが1回だけ実行される、または同じクエリが複数回実行されるが、その後の実行ごとに異なるクエリプランが生成される。