我有一个存储过程,借用了SQL Server MCSA Training Kit,它在我的数据库中显示了Missing Indexes。结果中有两条建议:
我的问题是,使用相同的密钥创建两个非聚集索引是不错的做法,即使它们有不同的包含列?
和
使用所有包含的列(9列)创建一个不是更好吗?
注意:第二个索引建议还包括第一个索引建议中的所有字段。
由于
答案 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)
包含col1
和col2
的索引的叶子大小将超过16字节。每8kb页面可以容纳500个索引叶。检索5000行将需要10页读取
包含col1
到col9
的索引将具有 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列不是此索引中的第一个。