sql-server - 聚集索引默认排序顺序

标签 sql-server tsql sql-server-2008 sql-server-2012 sql-server-2008-r2

我正在创建一个带有主键聚集索引的表。当我在不使用 asc/desc 的情况下进行创建时,默认的排序顺序是什么?哪种排序顺序(ASC 或 DESC)更有效?这是示例代码。

Create table employee (
  Name nvarchar(30),
  City nvarchar(30),
  Dob date,
  Constraint pk_employee primary key clustered
  (Name asc, dob asc)
)
Go

最佳答案

升序排列效率更高。我使用过的所有 RDBMS 都是如此,而且出于多种原因也是如此。 SQL Server 中降序排序(向后排序扫描)的最大问题是向后排序扫描无法利用并行执行计划。

请记住,排序的复杂度为 n(log n),比线性排序慢。换句话说,当您添加更多行时,每行的排序成本会更高。这就是为什么优化器经常选择并行执行计划来处理排序。如果您有很多行需要排序,您希望优化器能够选择并行排序。所以,再次强调——提升效率更高。

当您执行有序向后扫描时,优化器无法使用其他优化。例如,当使用分区窗口函数(使用 OVER 子句和 PARTITION BY 的函数)时,升序通常更有效。

这里有两篇关于这个主题的非常好的文章(均由 Itzik Ben-Gan 撰写):

SQL Server: Avoiding a Sort with Descending Order

Descending Indexes

关于sql-server - 聚集索引默认排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058713/

相关文章:

sql-server - 如何让 ASP.NET MVC 3.0 站点使用默认 SQLEXPRESS 以外的数据库

sql - 了解 Sql Server 查询 - ORDER BY 子句中的 CASE

sql-server-2005 - 如何使用 T-SQL 将字符串转换为日期时间?

SQL Where 子句排除了超出应有的范围

sql - 多次选择 top( x )

SQL 函数正确返回但在 Management Studio 中显示错误

sql - 在 select 语句中将连接查询重述为相关子查询

sql-server - SQL Server - 一列中的情况不同,但第二列中的最后一条记录

.net - SQL Express 客户端内存使用量与 SQL Enterprise 客户端内存使用量不同

asp.net - 使用 ADO.NET 批量插入多条记录并获取所有记录的身份