【问题标题】:Clustered index, order on single single, without order by clause聚集索引,单单排序,无 order by 子句
【发布时间】:2016-10-12 02:07:36
【问题描述】:

我有一个包含数百万条记录的事务表(单个主键),并且每天都会添加 100 条记录。

此表随后会进一步用于对账和结算,这仅发生在新插入的记录上,没有任何顺序。

虽然,我在 ID 列上创建了一个聚集索引,但不确定它应该是 ASC 还是 DESC。由于大部分处理都发生在新插入的记录上,所以我想将索引排序为 DESC,但不确定。

我已经在 StackOverflow 上查看了几个关于此的博客和问题,但他们都在讨论带有 order by 子句的复合聚集索引。在我的例子中,有单列聚集索引,不需要 order by。

【问题讨论】:

  • 没关系,SQL Server 可以从第一页或最后一页开始遍历索引,效率相同。
  • 感谢@RogerWolf 分享评论。您能否分享一些链接或更多详细信息。
  • 我认为您不会通过像select top (1000) * from dbo.Transactions order by Id desc 这样的查询来获取这些“新添加的”记录。如果这样做,您通常可以忘记并行处理和任何类型的效率。相反,您将查看一些显示事务当前处于哪个工作流阶段的字段。你会想要一个关于那个领域的索引,相信我。在这种情况下,聚集索引的顺序无关紧要。
  • 我认为你是对的。感谢您分享您的想法。

标签: sql sql-server indexing relational-database


【解决方案1】:

这取决于...对于某些操作,例如 ORDER BY,它并不重要,因为索引是双向的,因此不需要排序。

但对于其他操作,如排名、索引扫描等,这很重要。 SQL Engine 旨在以并行方式执行前向索引扫描,但如果查询优化器需要反向索引扫描,则此类操作是单线程的。因此,如果您选择错误的排序顺序,可能会影响性能。

这实际上取决于您数据库中的数据和查询,因此我建议捕获最频繁的用户查询(针对该表)并检查它们的执行计划和 IO 统计信息以获取两种不同的排序顺序。

如果添加数据的顺序与索引排序顺序不同,也会导致索引碎片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2019-11-29
    相关资源
    最近更新 更多