索引为什么要有顺序

作者:leen 来源:ITPOW 日期:2005-12-22

在建立索引时,有一个参数就是用以指定索引的顺序是升序还是降序,那么索引的升序还是降序对查询的性能有何影响呢。

当ORDER BY子句只有一个字段时,索引的顺序就没有什么影响了,因为不管我们是按升序还是降序排列,SQL Server都可以使用从头扫描至尾或从尾扫描至头的方式来到达最好的性能。

假如ORDER BY子句有多个字段,情况就非常复杂了。假设表中有索引:
CREATE CLUSTERED INDEX UPKCL_taind ON titleauthor(au_id DESC, title_id DESC)

我们在使用如下查询语句时:
select * from titleauthor order by au_id desc, title_id desc

ss1.jpg

 

再比较如下语句
select * from titleauthor order by au_id desc, title_id asc

ss2.jpg

这时我们发现多了Bookmark Lookup(根据表的情况和查询的语句的不同,可能此步骤也不同),这是因为无法一次完全使用索引造成的。我们再把索引改成
CREATE CLUSTERED INDEX UPKCL_taind ON titleauthor(au_id DESC, title_id ASC)
使用第二个查询语句就不会有Bookmark Lookup步骤了,因为它的索引顺序和查询排序一样。

我们上面使用的是聚集索引,如果是非聚集索引,可能会得到如下的结果。可以看到产生了全表扫描,所以说索引的顺序也是非常重要的。

ss3.jpg

注意建立组合索引时不应该只考虑order by,也应该把where考虑进来。

相关文章