执行计划显示已分区的聚集索引上缺少非聚集索引

Execution plan showing missing non-clustered index on already partitioned clustered indexes

我们有一个查询,其中 table 在列 Adate 上分区。

行数:56595943,分区方案 - 每年,分区数 - 300

聚集索引列:empid, Adate

查询:

select top 1 Adate
from emp
where empid = 134556 and Adate <= {ts '7485-09-01 00:00:00.0'}
order by Adate desc

实际执行计划returns 聚簇索引查找操作占聚簇索引键总查询成本的 93%。

但为什么优化器会推荐一个成本为 92% 的缺失索引?

missing index details: Improve query cost:92%

create nonclustered index IDX_NC on dbo.emp([empid], [Adate])

缺失索引的改进度量为 14755268,根据 Microsoft,改进度量基线为 1,000,000

为什么会这样?您是否建议在已经聚集的索引列上使用非聚集索引?

嗯 - 考虑一下:

  • (empid, adate)
  • 上有聚簇索引
  • 聚簇索引包含整个数据,例如聚集索引的叶级页面包含整个数据记录(table 中的所有列)

如果您正在搜索并且查询使用聚集索引,它可能仍然需要加载比实际需要更多的数据....整个记录,与找到您的条件的次数一样多。

如果您在 (empid, Adate) 上有一个 非聚集索引 ,并且您的查询实际上只需要 Adate(在其 SELECT列的列表),那么该索引将小得多 - 它包含 仅那两列 (none 所有其他列的开销,这些列对于您的当前查询)。因此,与聚集索引相比,扫描此索引或加载这些索引页面将加载更少的数据

从这个角度来看,是的,即使在构成聚集索引的 相同列 上有一个非聚集索引 也可以 对某些查询场景有益 - 这可能是 SQL 服务器查询优化器在这里选择的。