2013-10-17 43 views
3

我有一个数据库,我运行分析器和数据库顾问来提高数据库的性能。我做得很好,顾问给了我很多索引和统计数据,可以创建更好的性能。 但是看完我就遇到了这个语句:MS SQL索引列排序顺序很重要?

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 

同桌,同列,相同的参数,列的只是其他排序顺序...

所以我很困惑,不排序顺序索引创建真的很重要?

回答

2

是的复合索引中列的顺序很重要。

它们都将在所有4列上的等式谓词上同样适用。

但第一个将额外支持查询,如

WHERE lviewid = 1 AND lparentid 1 AND lid = 1 
ORDER BY xlactor 

,第二个将支持查询,如

WHERE parentid = 1 AND xlactor = 1 
ORDER BY lid, xlactor 

无论你是否应该创建两个指数取决于你的工作量。您是否为DTA提供了包括数据修改声明在内的代表性工作负载?

+0

这意味着,如果WHERE语句中的用法正确,我们必须查找所有源代码索引的排序顺序以防止相同内容的多个索引,我是对不对?由于这是由顾问创建的,因此我们可能会在WHERE语句中使用不同排序顺序对相同内容进行查询。 – YvesR

+0

并且:如果错误的排序顺序用法的索引不存在,他将不会使用其他现有的索引,是否正确? – YvesR

+0

@YvesR - 如果您的第一条评论是询问WHERE中谓词的顺序是否需要与索引定义中的谓词相同,那么答案是“no”。由于'lviewid'是第一个索引中的第一列,而第二个索引中的最后一列没有两个索引可以寻找的列的子集。因此,除了所有4列上的相等谓词的情况外,它们通常会帮助支持不同的查询。 –

1

你在混淆术语。排序顺序没有很好的影响,但是索引中列的顺序可能很重要。

复合索引的列的正确顺序取决于您的查询,但作为经验法则,具有最少不同值的列应该是第一个。

+0

尽管组合索引中列的顺序确实会影响索引的整体排序顺序。也许这就是他们的意思。 –

+0

@MartinSmith也许。在给出的例子中,所有列的排序顺序是相同的。 – podiluska

+0

第一个按照[lviewid] ASC,[lparentid] ASC,[lid] ASC,[xlactor] ASC排序,第二个按[[lparentid] ASC排序, [xlactor] ASC, [lid] ASC, [lviewid] ASC' –