创建2个具有相同键列但包含不同列的非聚簇索引

时间:2014-07-04 08:50:19

标签: sql sql-server indexing

我有一个存储过程,借用了SQL Server MCSA Training Kit,它在我的数据库中显示了Missing Indexes。结果中有两条建议:

  1. 两个关键列+2包括
  2. 相同的两个关键列+7包括
  3. 我的问题是,使用相同的密钥创建两个非聚集索引是不错的做法,即使它们有不同的包含列?

    使用所有包含的列(9列)创建一个不是更好吗?

    注意:第二个索引建议还包括第一个索引建议中的所有字段。

    由于

2 个答案:

答案 0 :(得分:0)

  

使用所有包含的列(9列)创建一个不是更好吗?

取决于不同列的相对大小。 假设您的表有这11列:

indexedCol1 int
indexedCol2 int
col1        int
col2        int
col3        varchar(1000)
col4        varchar(1000)
col5        varchar(1000)
col6        varchar(1000)
col7        varchar(1000)
col8        varchar(1000)
col9        varchar(1000)

包含col1col2的索引的叶子大小将超过16字节。每8kb页面可以容纳500个索引叶。检索5000行将需要10页读取

包含col1col9的索引将具有 max 大小的叶子将略高于7032字节。让我们说这些varchar列平均满10%。一行的平均大小为700字节。每8kBytes页面可以容纳11个索引叶。 检索5000行将需要大约450页读取。它会慢得多。

这是一个当然的例子。但我认为这是处理这个问题的方法。

  

例如,如果它使用公共密钥并且需要返回   一个包含在两个索引中的列,它将选择具有的列   少包括或不包括。

我会这么说。但这只是猜测。

答案 1 :(得分:-1)

  

使用所有包含的列(9列)创建一个不是更好吗?

这取决于您计划的查询。例如,表T在列A,B,C上有一个索引。

查询

select * from T where C = ...

不会使用此索引,因为A和B列上没有where-predicated,而C列不是此索引中的第一个。