聚簇索引默认排序顺序
Clustered index default sorting order
我正在创建一个带有主键聚集索引的 table。当我在没有 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
默认为 ASC。这取决于执行哪种搜索。 ASC 在处理身份时效率更高。
索引存储为二叉树,所以我想说性能上不会有任何差异。
无论是ASC还是DESC,SQL都需要向下获取叶子(记录包含在resulset中)。
升序效率更高。这对于我使用过的所有 RDBMS 都是如此,并且出于多种原因也是如此。 SQL 服务器中降序排序(ordered-backward 扫描)的最大问题是 ordered-backward 扫描无法利用并行执行计划。
请记住,排序的复杂度为 n(log n),比线性排序慢。换句话说,随着您添加更多行,每一行的排序成本都会更高。这就是优化器经常选择并行执行计划来处理排序的原因。如果您有很多行要排序,您希望优化器可以选择并行排序。所以,再次 - 上升更有效率。
当您执行 ordered-backward 扫描时,还有其他优化器无法使用优化器。例如,当使用分区 window 函数(使用 OVER 子句和 PARTITION BY 的函数)时,升序通常更有效。
这里有两篇关于这个主题的非常好的文章(都是 Itzik Ben-Gan):
升序在聚簇索引中效率更高。这对于我使用过的所有 RDBMS 都是如此,并且出于多种原因也是如此。 SQL 服务器中降序排序(顺序向后扫描)的最大问题是顺序向后扫描无法利用并行执行计划。
我正在创建一个带有主键聚集索引的 table。当我在没有 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
默认为 ASC。这取决于执行哪种搜索。 ASC 在处理身份时效率更高。
索引存储为二叉树,所以我想说性能上不会有任何差异。
无论是ASC还是DESC,SQL都需要向下获取叶子(记录包含在resulset中)。
升序效率更高。这对于我使用过的所有 RDBMS 都是如此,并且出于多种原因也是如此。 SQL 服务器中降序排序(ordered-backward 扫描)的最大问题是 ordered-backward 扫描无法利用并行执行计划。
请记住,排序的复杂度为 n(log n),比线性排序慢。换句话说,随着您添加更多行,每一行的排序成本都会更高。这就是优化器经常选择并行执行计划来处理排序的原因。如果您有很多行要排序,您希望优化器可以选择并行排序。所以,再次 - 上升更有效率。
当您执行 ordered-backward 扫描时,还有其他优化器无法使用优化器。例如,当使用分区 window 函数(使用 OVER 子句和 PARTITION BY 的函数)时,升序通常更有效。
这里有两篇关于这个主题的非常好的文章(都是 Itzik Ben-Gan):
升序在聚簇索引中效率更高。这对于我使用过的所有 RDBMS 都是如此,并且出于多种原因也是如此。 SQL 服务器中降序排序(顺序向后扫描)的最大问题是顺序向后扫描无法利用并行执行计划。