我们有一个查询,其中表在第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,根据改进度量基线为 1,000,000 Microsoft
为什么会这样?是否建议在已经聚集索引的列上使用非聚集索引?
好吧 - 考虑一下:
- 您确实有聚集索引
(empid, adate)
聚集索引包含整个数据, - 例如,聚集索引的叶级页面包含整个数据记录(表中的所有列(
如果您正在搜索并且查询使用聚集索引,则它可能仍需要加载比实际需要的多得多的数据。整个记录,找到您的条件的次数。
如果你有一个非聚集索引只在(empid, Adate)
上,并且你的查询实际上只需要Adate
(在其SELECT
列列表中(,那么这个索引会小得多 - 它只包含这两列(没有所有其他列的开销,当前查询不需要这些列(。因此,与聚集索引相比,扫描此索引或加载这些索引页将加载更少的数据。
从这个角度来看,是的,即使在构成聚集索引的同一列上具有非聚集索引也可能对某些查询方案有益- 这可能是 SQL Server 查询优化器在此处选取的内容。