当我在 Azure SQL 数据库 (v12) 或 SQL Server 2016 实例中执行以下代码时,我在 EstimatedRowsRead 列中获得了值,但在EstimatedRows列中却没有,我不明白为什么。有任何想法吗?
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
,PlanHandles AS (
SELECT plan_handle
,total_elapsed_time = SUM(total_elapsed_time)
,execution_count = SUM(execution_count)
FROM sys.dm_exec_query_stats
GROUP BY plan_handle
)
,Plans AS (
SELECT ph.plan_handle, qp.query_plan, ph.total_elapsed_time, ph.execution_count
FROM PlanHandles ph
OUTER APPLY sys.dm_exec_query_plan(ph.plan_handle) qp
)
SELECT p.total_elapsed_time
,p.execution_count
,p.plan_handle
,p.query_plan
,NodeId = s.i.value(N'@NodeId', N'INT')
,EstimatedRowsRead = s.i.value(N'(@EstimatedRowsRead)[1]', N'FLOAT')
,EstimatedRows = s.i.value(N'(@EstimatedRows)[1]', N'FLOAT')
FROM Plans p
CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/*') q(n)
CROSS APPLY n.nodes('.//RelOp[IndexScan and IndexScan/Object[@Schema!="[sys]"]]') s(i)
WHERE s.i.value(N'(@EstimatedRowsRead)[1]', N'FLOAT') > 1.0;
原因是一个小错字,但我同意 Estimatedrows 似乎是可行的方法。
在执行计划的 XML 中调用它
Estimaterows
而不是预期的EstimatedRows
.一个例子:
这应该工作:
结果示例