在建立索引时,有一个参数就是用以指定索引的顺序是升序还是降序,那么索引的升序还是降序对查询的性能有何影响呢。
当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
再比较如下语句
select * from titleauthor order by au_id desc, title_id asc
这时我们发现多了Bookmark Lookup(根据表的情况和查询的语句的不同,可能此步骤也不同),这是因为无法一次完全使用索引造成的。我们再把索引改成
CREATE CLUSTERED INDEX UPKCL_taind ON titleauthor(au_id DESC, title_id ASC)
使用第二个查询语句就不会有Bookmark Lookup步骤了,因为它的索引顺序和查询排序一样。
我们上面使用的是聚集索引,如果是非聚集索引,可能会得到如下的结果。可以看到产生了全表扫描,所以说索引的顺序也是非常重要的。
注意建立组合索引时不应该只考虑order by,也应该把where考虑进来。