在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的列始终是该表上任何其他索引的尾随列.

Sql相关问答推荐

需要解决办法通过传递过程参数而不是声明表行类型来声明表类型

我希望以正确的升序获取SQL结果.怎样才能得到它们?

MariaDB查询在逗号分隔的字符串中查找多个值

如何在SQL Server中拆分包含字符和数字的列?

仅在日期相隔时递增(Oracle SQL)

如何用QuestDB生成蜡烛图?

如何为缺少的类别添加行

改进的SQL子字符串提取

Select 最频繁的值以及分组依据

在 PostgreSQL 中使用 ltree 列进行累积

替换SQL Server XML中多处出现的 node 值

没有调用子查询的嵌套 JOIN语法是什么?

SQL Server - 判断 ids 层次 struct 中的整数 (id)

postgres按组消除分区中的NULLS

SQL Server 分区和 Run Case 语句

Postgres 条件求和函数

SQL 查询以填充单个列中的所有值

在 sql 中合并系列以删除重复项

使用一组值进行分组和计数

如何比较同一张表中的行并进行相应更新