在MS SQL Server(我使用的是版本2005)中为一列或多列创建索引时,可以指定每列上的索引为升序或降序.我很难理解为什么会有这样的 Select .使用二进制排序技术,两种方法的查找速度不是都一样快吗?我 Select 的顺序有什么区别?
在MS SQL Server(我使用的是版本2005)中为一列或多列创建索引时,可以指定每列上的索引为升序或降序.我很难理解为什么会有这样的 Select .使用二进制排序技术,两种方法的查找速度不是都一样快吗?我 Select 的顺序有什么区别?
当与复合索引一起使用时,这一点至关重要:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
可用于:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
或者:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, but not f或者:
SELECT *
FROM mytable
ORDER BY
col1, col2
单列上的索引可以有效地用于两种方式的排序.
有关详细信息,请参阅我博客中的文章:
Update:
事实上,即使对于一个单列索引,这也可能很重要,尽管这并不明显.
想象一个聚集表列上的索引:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
col1
上的索引保持col1
的有序值以及对行的引用.
由于表是集群的,所以对行的引用实际上是pk
的值.它们的每个值也在col1
以内.
这意味着索引的叶子实际上是按(col1, pk)
排序的,这个查询:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
不需要分类.
如果我们按照以下方式创建索引:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
,则col1
的值将按降序排序,但每个值col1
内的pk
的值将按升序排序.
这意味着以下查询:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
可以由ix_mytable_col1_desc
人提供,但不能由ix_mytable_col1
人提供.
换句话说,在任何表上构成CLUSTERED INDEX
的列始终是该表上任何其他索引的尾随列.