【问题标题】:Primary key Ascending vs Descending主键升序与降序
【发布时间】:2010-10-13 13:17:54
【问题描述】:

在 Sql Server 中,我有一个带有 Identity 主键的表。通常我想要最新的几条新记录,所以我获取按主键降序排序的 Top n。我应该将主键索引定义为降序,还是没有区别?即如果它们按升序排列,那么 sql 是否可以同样有效地向后工作?

【问题讨论】:

  • 不,您应该将其创建为desc。您最终会从插入 as shown here 中得到大量逻辑碎片

标签: sql-server indexing primary-key


【解决方案1】:

从纯粹的查询的角度来看,如果你想拉 N 个最近或 N 个最旧的记录,你的键是降序还是升序没有区别:

SQL Server 的内部算法可以在单列索引上双向高效地导航,而不管键的存储顺序如何。例如,在单列索引上指定 DESC 不会使使用 ORDER BY IndexKeyCol DESC 子句的查询比为索引指定 ASC 时运行得更快。

http://msdn.microsoft.com/en-us/library/aa933132(SQL.80).aspx

然而几乎在任何正常情况下,您希望您的主键是升序并按顺序排列以防止碎片。 SQL Server 针对将新记录物理附加到数据库文件末尾进行了优化。如果它需要在顶部插入每条新记录并将所有内容下推,则可能会导致近 100% 的碎片。

【讨论】:

    【解决方案2】:

    这完全没有区别。

    我什至无法想象为什么可以以任何一种方式声明它。

    【讨论】:

    • 对于单列索引,没有区别,但是当索引中有多个列时,ASC 和 DESC 会发挥作用,并且顺序对于第二/第三/第四/等列很重要。
    • 这对我来说毫无意义。如果您有两个字段值,那么如何下降树完全无关紧要。这只是猜测,还是您有参考?
    • 对我来说很有意义。如果您有一个声明为A ASC, B DESC 的索引,但您的大多数查询都是ORDER BY A ASC, B ASC,这不会避免排序。
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2014-10-24
    • 2018-10-26
    相关资源
    最近更新 更多