聚集索引默认排序顺序

Mad*_*kar 5 t-sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012

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

\n\n
Create table employee (\n  Name nvarchar(30),\n  City nvarchar(30),\n  Dob date,\n  Constraint pk_employee primary key clustered\n  (Name asc, dob asc)\n)\nGo\n
Run Code Online (Sandbox Code Playgroud)\n

Ala*_*ein 2

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

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

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

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

SQL Server:避免降序排序

降序索引

  • 向后排序扫描仅意味着扫描未并行化 - 它不会阻止整个计划中的并行性 https://www.sql.kiwi/2011/12/forcing-a-parallel-query-execution-plan.html (2认同)