我一直在深入研究,我经常看到对“即席查询”的引用。但是,我还没有看到Query决定了一个即席查询是什么。我看到了一些地方,可以推断它是一个没有参数的查询,或者只执行了一次查询。这是否有正式的定义?我不是说一般的。我的意思是因为它与查询商店有关。
作为一个例子,这个页面展示了一个从查询存储中删除临时查询的例子,但是它使用的标准似乎只是一个执行计数。这似乎是一个临时查询的奇怪定义。顺便说一句,如果你转到页面,搜索“删除临时查询”。
发布于 2017-10-11 13:44:36
经过一点搜索,我无法从微软的文档中找到一个具体和令人满意的来源来回答这个问题。关于adhoc/adhoc/adhoc有很多很好的第三方描述和定义,但是对于这个问题的特殊性,我认为一个接近源的描述和定义是理想的。
过去是泛型的(但仍然准确)定义,比如这是如此的帖子 (谢谢SqlWorldWide),如果我们看一下文档在这个主题上说了什么,它就会同意您提到的基于执行次数的定义,我认为我们可以把它当作事实。
自组织工作流的优化上的文章说,
当此选项设置为1时,当第一次编译批处理时,数据库引擎将在计划缓存中存储一个小的已编译计划存根,而不是完整的已编译计划。这有助于缓解内存压力,因为它不允许计划缓存被未重用的已编译计划填充。已编译的计划存根允许数据库引擎识别此特殊批处理以前已编译过,但只存储了已编译的计划存根,因此当再次调用此批处理(编译或执行)时,数据库引擎将编译该批.并将完整编译的计划添加到计划缓存中。
因此,看起来also查询服务器配置选项也使用单个执行的定义作为also的定义。如果查询继续执行并生成相同的计划,则将不再将其视为相同的计划。
关于查询存储的最佳实践的文章也与此相一致,
将不同query_hash值的数量与sys.query_store_query中的条目总数进行比较。如果比率接近1,则您的临时工作负载会生成不同的查询。
当然,这是针对尚未用作存储过程、参数化等的查询,因为它们可以立即被识别和适当处理。
因此,基于所有这些,我们可以说,在以下情况下,查询被视为是临时的:
发布于 2017-10-11 13:38:09
对于即席查询,object_id列在sys.query_store_query DMV中将为0,如sys.query_商店_查询文档中所述:
object_id:查询所包含的数据库对象的ID (存储过程、触发器、CLR /UDAgg等)。如果查询不是作为数据库对象的一部分执行(即席查询)。
您可以根据这个值来识别即席查询,即使它没有明确声明为“这是即席查询的定义”。:)
发布于 2017-10-11 13:49:34
ad一词用于指只执行过一次的查询.这与数据库设置“为临时工作负载进行优化”的定义是一致的。
您所引用的删除即席查询的链接包括以下特定定义:“删除即席查询:这将删除只执行一次且超过24小时的查询”。
https://dba.stackexchange.com/questions/188203
复制相似问题