Jer*_*oen 18 sql-server execution-plan
我有一个典型的例子,参数嗅探导致一个“坏”的执行计划进入计划缓存,导致我的存储过程的后续执行非常缓慢。我可以用局部变量OPTIMIZE FOR ... UNKNOWN、 和来“解决”这个问题OPTION(RECOMPILE)。但是,我也可以深入查询并尝试优化它。
我正在尝试确定我是否应该:鉴于解决问题的时间有限,我想知道不这样做的成本。在我看来,如果我坚持使用OPTION(RECOMPILE),净效果是每次运行查询时都会重新创建查询计划。所以,我想我需要知道:
如何找出创建查询计划的成本是多少?
为了回答我自己的问题,我在谷歌上搜索过(例如使用这个查询),并且我已经浏览了dm_exec_query_statsDMV列的文档 。我还检查了 SSMS 中的“实际查询计划”的输出窗口以找到此信息。最后,我搜索了 DBA.SE。这些都没有得到答案。
谁能告诉我?是否可以找到或测量创建计划所需的时间?
Pau*_*ite 18
如何找出创建查询计划的成本是多少?
可以在查询计划中查看根节点的属性,例如:

(来自免费的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]', 'int'),
CompileMemory = c.value('(QueryPlan/@CompileMemory)[1]', 'int'),
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);
Run Code Online (Sandbox Code Playgroud)

有关处理此类查询的选项的完整处理,请参阅 Erland Sommarskog最近更新的文章。
| 归档时间: |
|
| 查看次数: |
4761 次 |
| 最近记录: |