加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 如何衡量或查找创建查询计划的成本?

发布时间:2020-12-12 06:21:04 所属栏目:MsSql教程 来源:网络整理
导读:我有一个典型的情况,参数嗅探导致“坏”执行计划落在计划缓存中,导致后续执行我的存储过程非常慢.我可以用局部变量,OPTIMIZE FOR … UNKNOWN和OPTION(RECOMPILE)来“解决”这个问题.但是,我也可以深入查询并尝试优化它. 我正在努力确定是否应该:在有限的时间
我有一个典型的情况,参数嗅探导致“坏”执行计划落在计划缓存中,导致后续执行我的存储过程非常慢.我可以用局部变量,OPTIMIZE FOR … UNKNOWN和OPTION(RECOMPILE)来“解决”这个问题.但是,我也可以深入查询并尝试优化它.

我正在努力确定是否应该:在有限的时间内解决问题我想知道不这样做的代价.在我看来,如果我坚持使用OPTION(RECOMPILE),那么净效果就是每次运行查询时都会重新创建查询计划.所以,我想我需要知道:

如何找出创建查询计划的成本是多少?

为了回答我自己的问题,我用Google搜索了(例如this query),我已经查看了dm_exec_query_stats DMV的列文档.我还检查了SSMS中的输出窗口,查找“实际查询计划”以查找此信息.最后,我是searched DBA.SE.这些都没有得到答案.

有人能告诉我吗?是否有可能找到或测量计划创建所需的时间?

解决方法

How to find out what the cost of creating a query plan is?

您可以在查询计划中查看根节点的属性,例如:

(免费Sentry One Plan Explorer截图)

通过查询计划缓存也可以获得此信息,例如使用基于以下关系的查询:

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT 
    CompileTime = c.value('(QueryPlan/@CompileTime)[1]','int'),CompileCPU = c.value('(QueryPlan/@CompileCPU)[1]',CompileMemory = c.value('(QueryPlan/@CompileMemory)[1]',ST.[text],QP.query_plan
FROM sys.dm_exec_cached_plans AS CP
CROSS APPLY sys.dm_exec_query_plan(CP.plan_handle) AS QP
CROSS APPLY sys.dm_exec_sql_text(CP.plan_handle) AS ST
CROSS APPLY QP.query_plan.nodes('ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS N(c);

有关处理这些查询的选项的完整处理,请参阅Erland Sommarskog的recently updated article.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读