0

我们有一个查询,其中表在 column 上分区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

实际执行计划返回一个聚集索引查找操作,占聚集索引键总查询成本的 93%。

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

缺少索引详细信息:提高查询成本:92%

在 dbo.emp([empid], [Adate]) 上创建非聚集索引 IDX_NC

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

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

4

1 回答 1

0

好吧-考虑一下:

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

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

如果你在 just 上有一个非聚集索引(empid, Adate),并且你的查询真的只需要Adate(在它SELECT的列列表中),那么这个索引会小得多 - 它只包含那两列(没有所有其他列的开销,您当前的查询不需要这些)。所以扫描这个索引,或者加载这些索引页面,与聚集索引相比,加载的数据要少得多。

从这个角度来看,是的,即使在构成聚集索引的相同列上具有非聚集索引可能对某些查询方案有益——这可能是 SQL Server 查询优化器在这里所​​采用的。

于 2019-09-03T18:24:25.890 回答