SQL Server 查询存储 - 什么是“临时”查询?

Ran*_*der 10 sql-server query-store

我一直在深入研究 SQL Server 查询存储,我经常看到对“临时”查询的引用。但是,我还没有看到查询存储确定临时查询是什么。我见过一些地方,它可以被推断为不带参数的查询或只执行一次的查询。是否存在对此的正式定义?我不是说一般。我的意思是因为它与查询存储有关。

例如,此页面显示了从查询存储中删除临时查询的示例,但它使用的条件似乎只是执行计数为 1。这似乎是临时查询的奇怪定义。顺便说一句,如果您转到该页面,请搜索“删除临时查询”。

Low*_*n M 9

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

超越通用(但仍然准确)的定义,如这个 SO 帖子(感谢 SqlWorldWide),如果我们查看文档对该主题的说明,它同意您提到的基于执行次数的定义,我认为我们可以将其视为事实。

关于优化临时工作流的文章说,

当此选项设置为 1 时,数据库引擎在第一次编译批处理时将一个小的编译计划存根存储在计划缓存中,而不是完整的编译计划。这有助于通过不允许计划缓存被未重用的已编译计划填充来缓解内存压力。已编译的计划存根允许数据库引擎识别此临时批处理之前已编译但仅存储了一个已编译的计划存根,因此当再次调用(编译或执行)此批处理时,数据库引擎会编译批处理...并将完整编译的计划添加到计划缓存中。

所以看起来 ad hoc 查询服务器配置选项也使用单次执行的定义作为 ad hoc 的定义。如果查询继续执行并生成相同的计划,它将不再被视为如此。

查询存储最佳实践的文章也与此一致,

将不同的 query_hash 值的数量与 sys.query_store_query 中的条目总数进行比较。如果比率接近 1,您的临时工作负载会生成不同的查询。

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

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

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