【问题标题】:Is it a good idea to index a date column in descending order?按降序索引日期列是个好主意吗?
【发布时间】:2011-09-18 22:46:48
【问题描述】:

在大多数具有日期列的表中,我们“通常会”查询最近的信息。

“一般”按降序索引日期列是否是个好主意?

【问题讨论】:

  • 如果您的查询正在使用索引,那么是的,这是一个好主意(除非它们将 INSERT 减慢很多)
  • @a_horse_with_no_name:所以你的意思是“这取决于,尝试并分析结果”。
  • @mu: 或多或少是的 ;)

标签: database oracle indexing


【解决方案1】:

不熟悉 Oracle 的内部结构,但这是我对它如何与 Postgres 一起使用的理解:

为所有意图和目的对索引进行聚类。因此,如果您将它们按 asc 排序并且总是在其末尾添加新行(例如 created_at、updated_at、billed_at 等),您的新行将被追加(或几乎如此)而不是前置(导致磁盘页面分裂)。这样更快。

您的查询规划器会愉快地以相反的顺序读取索引。因此,如果它是单列索引,则任何一种都可以 - 在涉及如何在用例中插入新行时使用最自然的方法。

当您拥有多列索引时,以相反顺序排列的索引可能会变得有趣。比如说,(id, created_at desc) 在审计日志表中。这实际上是一个不好的例子,但重点是:如果您按id, created_at desc 订购,索引将按原样使用。

【讨论】:

  • 与 Oracle 几乎相同。它可以按降序读取索引,并且在将多列索引与相同的多列顺序匹配时,ASC/DESC 最有意义
【解决方案2】:

除非您看到显着的性能改进,否则您可能希望避免使用降序索引。降序索引实际上是基于函数的索引,并且有一些限制。

例如,根据SQL Reference,唯一降序索引不允许有多个空值,并且在分析索引和表之前不会使用降序索引。 (虽然我无法重现第二个限制。)

此外,基于函数的索引有些不同,并且往往会破坏每个人编写的索引维护脚本。这不是避免它们的好理由,只是需要注意的事情。

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 2019-06-26
    • 2012-04-27
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    相关资源
    最近更新 更多