我有一个数据库,我运行分析器和数据库顾问来提高数据库的性能。到目前为止,效果很不错,顾问向我展示了许多可以创建的索引和统计信息,以获得更好的性能。 但是,在阅读语句时,我遇到了这个:
CREATE NONCLUSTERED INDEX [_dta_index_xinfobaseacl_11_397426127__K3_K7_K1_K5] ON [dbo].[xinfobaseacl]
(
[lviewid] ASC,
[lparentid] ASC,
[lid] ASC,
[xlactor] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
go
CREATE NONCLUSTERED INDEX [_dta_index_xinfobaseacl_11_397426127__K7_K5_K1_K3] ON [dbo].[xinfobaseacl]
(
[lparentid] ASC,
[xlactor] ASC,
[lid] ASC,
[lviewid] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
go
同一张表,同样的列和参数,只是列的排序方式不同...
所以我很困惑,创建索引时排序顺序真的很重要吗?
WHERE
语句中谓词的顺序是否需要与索引定义中的顺序相同,那么答案是“不需要”。因为lviewid
是第一个索引中的初始列,而在第二个索引中是最后一列,所以没有三列的子集可以使得这两个索引都能够查找。因此,除非在4个列上使用等值谓词,否则它们通常会支持不同的查询。 - Martin Smith