聚簇索引上的列顺序

时间:2012-12-21 17:58:13

标签: sql-server sql-server-2008-r2

  

可能重复:
  SQL Server Clustered Index - Order of Index Question

我知道聚集索引中的列顺序很重要。

我打算在3列上添加聚簇索引,这些列总是涉及where子句-an int,bit和datetimeoffset列。此外,datetimeoffset列存储增量值。

将datetimeoffset列作为聚集索引中的第一列是否有意义?欣赏它。

2 个答案:

答案 0 :(得分:6)

列顺序对所有索引都很重要,而不仅仅是聚簇索引。

最佳列顺序由多个因素决定:

您是否只使用其中一列来查询此表,而不是其他列?如果您的索引定义为ColumnA, ColumnB ...并且您执行的查询仅使用ColumnB进行过滤,则无法使用该索引,因为ColumnB不在索引的前沿

每个列中的值有多大选择性?索引列中包含的值越明确,索引就越有效。这也是您可能不希望在索引中包含bit列的原因,因为只有2个可能的值。更具选择性的列更适合处于领先地位。

答案 1 :(得分:3)

正如Michael所提到的,索引中的列顺序与您在WHERE子句中的列顺序直接相关。

为了说明这一点,作为测试,我创建了三个表,每个表都有一个不同的列作为聚集索引中的第一个。然后,我用10,000行数据填充它们。

在所有三个表中执行相同的SQL查询会产生非常不同的性能结果:

set statistics io on
set statistics time on

select * from DtFirst where DtCol between '4/1/2010' and '6/1/2010'
select * from IntFirst where DtCol between '4/1/2010' and '6/1/2010'
select * from BitFirst where DtCol between '4/1/2010' and '6/1/2010'

set statistics io off
set statistics time off

统计数据如下:
第一个表(日期列第一)
扫描计数1,逻辑读取 3
CPU时间= 0 ms,经过时间= 0 ms
第二表(日期栏第二)
扫描计数1,逻辑读取 29
CPU时间= 0 ms,经过时间= 113 ms
第三表(日期栏第三)
扫描计数1,逻辑读取 29
CPU时间= 0 ms,经过时间= 145 ms
如您所见,查询聚簇索引中首先排序日期列的表上的日期显然可以产生更好的结果。