我刚刚在SSMS中检查了一个估计的执行计划.我注意到查询的查询成本为99%(相对于批处理).然后,我检查了下面显示的计划.该成本几乎完全来自表A中的"聚集索引删除".但是,缺失指数建议是针对表B.并且缺失指数影响据说是95%.
查询是一个DELETE依赖于嵌套循环语句(显然)INNER JOIN用TableB.如果根据计划的几乎所有成本都来自DELETE运营,为什么指数建议在表B上 - 即使它是扫描 - 只有0%的成本?95%的影响是否会影响扫描的可忽略的成本(列在0%上)而不是查询的总成本(据说几乎是所有批次的成本)?
如果可能,请解释IMPACT.这是计划:

Bog*_*ean 12
假设缺失影响%的解释与sys.dm_db_missing_index_group_stats系统视图中的avg_user_impact列的解释相同或相似,则缺少影响%表示(或多或少):
如果实现了缺少的索引组,则用户查询可能会遇到的平均百分比收益.该值意味着如果实现了缺少的索引组,查询成本将平均下降此百分比.
Mar*_*ith 10
这是批处理中的查询27.
可能它显示的影响实际上属于完全不同的陈述(1-26).
这似乎是SSMS中估计计划的影响显示方式的问题.
下面的两个批次包含相同的两个语句,顺序颠倒过来.请注意,在第一种情况下,它声称这两种陈述99.38对第二种情况的影响同等有帮助49.9818.
因此,它显示了对丢失的索引遇到的第一个实例的估计影响- 而不是实际与该语句相关的影响.
我没有在实际执行计划中看到这个问题,并且即使在估算的计划中,每个语句旁边的计划XML中也会显示正确的影响.
我在此处添加了有关此问题的Connect项目报告.(虽然可能你遇到了另一个问题,因为10%的影响似乎是计划中包含的缺失指数细节的截止点,很难看出这可能与问题中描述的原因相同)
示例数据
CREATE TABLE T1
(
X INT,
Y CHAR(8000)
)
INSERT INTO T1
(X)
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY @@spid)
FROM sys.all_objects o1,
sys.all_objects o2
Run Code Online (Sandbox Code Playgroud)
批次1
SELECT *
FROM T1
WHERE X = -1
SELECT *
FROM T1
WHERE X = -1
UNION ALL
SELECT *
FROM T1
Run Code Online (Sandbox Code Playgroud)

批次2
SELECT *
FROM T1
WHERE X = -1
UNION ALL
SELECT *
FROM T1
SELECT *
FROM T1
WHERE X = -1
Run Code Online (Sandbox Code Playgroud)

下面是第一个计划的XML(严重截断),表明正确的信息在计划本身中.
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML>
<BatchSequence>
<Batch>
<Statements>
<StmtSimple StatementCompId="1">
<QueryPlan>
<MissingIndexes>
<MissingIndexGroup Impact="99.938">
<MissingIndex Database="[tempdb]" Schema="[dbo]" Table="[T1]">
<ColumnGroup Usage="EQUALITY">
<Column Name="[X]" ColumnId="1" />
</ColumnGroup>
</MissingIndex>
</MissingIndexGroup>
</MissingIndexes>
</QueryPlan>
</StmtSimple>
</Statements>
<Statements>
<StmtSimple StatementCompId="2">
<QueryPlan>
<MissingIndexes>
<MissingIndexGroup Impact="49.9818">
<MissingIndex Database="[tempdb]" Schema="[dbo]" Table="[T1]">
<ColumnGroup Usage="EQUALITY">
<Column Name="[X]" ColumnId="1" />
</ColumnGroup>
</MissingIndex>
</MissingIndexGroup>
</MissingIndexes>
</QueryPlan>
</StmtSimple>
</Statements>
</Batch>
</BatchSequence>
</ShowPlanXML>
Run Code Online (Sandbox Code Playgroud)