2

我有一个 sql 查询,它获取设计为低级队列的表中的前 N ​​行。

select top N * from my_table where status = 0 order by date asc

此查询背后的意图如下:

  • 首先,这个问题与数据库无关,因为我的实现将支持 sql server、oracle、DB2 和 sybase。上面“top N”的sql语法只是一个例子。
  • 该表可以包含数百万行。
  • 相比之下,N 是一个相对较小的数字,例如 100。
  • 当行在队列中时状态为 0。稍后它变为 1 表示它正在处理中。处理后删除。因此,预计表中至少 90% 的行的状态为 0。
  • 表中的行应根据其日期获取,因此该order by子句。

使此查询最快运行的最佳索引是什么?

我最初认为索引应该是 on (date, status),但我不确定了。由于状态列将大部分包含零,它是否有附加值?单独索引就足够了(date)吗?
或者也许应该是(status, date)

4

2 回答 2

2

我认为没有独立于 RDMS 的有效解决方案。例如,Oracle 有位图索引,SQLServer 有部分索引,如果 Mysql 或 Sqlite 没有类似的东西,我看不出不使用它们的理由。此外,从历史上看,SQLServer 实现聚簇表(或 Oracle 世界中的 IOT)的方式比 Oracle 更好,因此在日期列上具有聚簇索引可能对 SQLServer 非常有效,但不适用于 Oracle。

我宁愿改变一点方法。如果您说 90% 的行不满足status=0条件,为什么不尝试重构模式,并添加一个仅包含您感兴趣的记录的新表(或物化视图)?即使 RDMS 不直接支持物化视图,保持该表最新并将数据与原始表合并所需的新可编程对象的数量也相对较少。此外,如果可以重新设计底层逻辑,使行永远不会更新,只会插入或删除,那么这将有助于避免锁争用,从而使整个系统具有更好的性能。

于 2012-06-10T14:54:22.450 回答
0

在 Date 上有一个聚集索引,在 Status 上有一个非聚集索引。

于 2012-06-10T15:04:28.290 回答