sql-server – SQL Server查询存储 – 什么被认为是’ad-hoc’查询?

我一直在深入研究SQL Server查询存储,我经常看到对’ad-hoc’查询的引用.但是,我还没有看到Query Store确定的即席查询.我已经看到了可以推断为没有参数的查询或只执行一次查询的地方.这是否存在正式定义?我不是一般的意思.我的意思是它与Query Store有关.

例如,此page显示了从查询存储中删除即席查询的示例,但似乎它使用的条件是执行计数只有一个.这似乎是ad-hoc查询的奇怪定义.顺便说一句,如果你转到页面,搜索“删除即席查询”.

最佳答案
经过一番搜索后,我无法从微软的文档中找到具体而令人满意的来源来回答这个问题.有很多好的第三方描述和adhoc / ad-hoc / ad hoc的定义,但是对于这个问题的特殊性,我认为接近源是理想的.

移过通用(但仍然准确)的定义,如this SO post(感谢SqlWorldWide),如果我们看一下文档对该主题所说的内容,它同意你所提到的关于定义基于执行次数的内容,我想到我们可以把它当成事实.

optimizing for ad hoc workflows上的文章说,

When this option is set to 1, the Database Engine stores a small
compiled plan stub in the plan cache when a batch is compiled for the
first time, instead of the full compiled plan. This helps to relieve
memory pressure by not allowing the plan cache to become filled with
compiled plans that are not reused. The compiled plan stub allows the
Database Engine to recognize that this ad hoc batch has been compiled
before but has only stored a compiled plan stub, so when this batch is
invoked (compiled or executed) again, the Database Engine compiles the
batch … and adds
the full compiled plan to the plan cache.

因此,即席查询服务器配置选项似乎也使用单个执行的定义作为ad hoc的定义.如果查询继续执行并生成相同的计划,则不再对其进行处理.

Best Practices for Query Store上的文章也与此一致,

Compare the number of distinct query_hash values with the total number
of entries in sys.query_store_query. If the ratio is close to 1 your
ad-hoc workload generates different queries.

当然,这适用于尚未用作存储过程,参数化等的查询,因为它们可以立即被识别和处理.

因此,基于所有这些,我们可以说在以下情况下将查询视为临时:

>它没有参数化
>它不是以编程方式存储在数据库中(存储过程,函数,触发器等)
>同一个查询只执行一次
或多次执行相同的查询,但为每个后续执行生成不同的查询计划.

转载注明原文:sql-server – SQL Server查询存储 – 什么被认为是’ad-hoc’查询? - 代码日志