SQL Server 2008执行计划中"缺失索引影响%"的含义是什么?

Mic*_*tty 23 sql-server

我刚刚在SSMS中检查了一个估计的执行计划.我注意到查询的查询成本为99%(相对于批处理).然后,我检查了下面显示的计划.该成本几乎完全来自表A中的"聚集索引删除".但是,缺失指数建议是针对表B.并且缺失指数影响据说是95%.

查询是一个DELETE依赖于嵌套循环语句(显然)INNER JOINTableB.如果根据计划的几乎所有成本都来自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)