AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 188203
Accepted
Randy Minder
Randy Minder
Asked: 2017-10-12 05:17:48 +0800 CST2017-10-12 05:17:48 +0800 CST 2017-10-12 05:17:48 +0800 CST

SQL Server 查询存储 - 什么被视为“临时”查询?

  • 772

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

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

sql-server query-store
  • 4 4 个回答
  • 3866 Views

4 个回答

  • Voted
  1. Best Answer
    LowlyDBA - John M
    2017-10-12T05:44:36+08:002017-10-12T05:44:36+08:00

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

    超越像这个 SO 帖子这样的通用(但仍然准确)定义(感谢 SqlWorldWide),如果我们查看文档在该主题上所说的内容,它与您提到的基于执行次数的定义一致,我认为我们可以将其视为事实。

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

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

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

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

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

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

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

    • 它没有参数化
    • 它不是以编程方式存储在数据库中(存储过程、函数、触发器等)
    • 同一个查询只执行一次,或者同一个查询执行多次,但每次后续执行都会生成不同的查询计划。
    • 9
  2. Rigerta
    2017-10-12T05:38:09+08:002017-10-12T05:38:09+08:00

    对于临时查询,DMV 中的object_id列sys.query_store_query将为 0,如sys.query_store_query 文档中所述:

    object_id:

    查询所属的数据库对象的 ID(存储过程、触发器、CLR UDF/UDAgg 等)。如果查询不作为数据库对象的一部分执行(即席查询),则为 0。

    您可以根据该值识别即席查询,即使它没有明确说明为“这是即席查询的定义”。:)

    • 4
  3. Matthew McGiffen
    2017-10-12T05:49:34+08:002017-10-12T05:49:34+08:00

    术语 ad-hoc 用于指代仅执行一次的查询。这与用于数据库设置“针对临时工作负载优化”的定义一致。

    您引用的有关删除临时查询的链接包括此特定定义“删除临时查询:这将删除仅执行一次且超过 24 小时的查询”。

    • 0
  4. LCJ
    2019-01-22T11:48:01+08:002019-01-22T11:48:01+08:00

    来自learn.microsoft.com 中sys.dm_exec_cached_plans dmv 的objtype专栏的临时。

    Adhoc:即席查询。指使用 osql 或 sqlcmd 而不是作为远程过程调用作为语言事件提交的 Transact-SQL。

    此列的一个用途是查看具有多个计划的查询的情况,以查看多个计划是否由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
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve