执行计划从何而来?

Mag*_*ier 10 sql-server execution-plan sql-server-2008-r2 cache

有没有办法可以确定计划是为特定查询生成的,还是在计划缓存中找到的?

Han*_*non 9

SQL Server 2012 在计划本身中有一个指示符RetrievedFromCache,它可以是“真”或“假”。

这似乎是您要询问的财产。

这是一个示例(最后一行显示属性):

<StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1" 
StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" 
StatementSubTreeCost="0.0508992" StatementText="SELECT COUNT(*) 
&#xD;&#xA;FROM sys.tables" StatementType="SELECT" 
QueryHash="0x9A4B63A948B30EA0" QueryPlanHash="0xF357CAE882D5B15D" 
RetrievedFromCache="true">
Run Code Online (Sandbox Code Playgroud)

不幸的是,我在 SQL Server 2008 R2 生成的计划中没有看到任何类似的内容。

在 SQL Server 2008 R2 中,您可以使用sys.dm_exec_query_stats系统 DMV 检查creation_time具有相同query_hash值的计划的列。查询哈希可以从计划 XML 的标题中获得(参见上面的示例)。此查询将返回有关上述计划的行:

SELECT *
FROM sys.dm_exec_query_stats qs
WHERE qs.query_hash = 0x9A4B63A948B30EA0;
Run Code Online (Sandbox Code Playgroud)