我有一个SQL查询,它获取设计为低级队列的表中的前N行。优化查询与列在哪里条款
select top N * from my_table where status = 0 order by date asc
此查询背后的意图是如下:
- 首先,这个问题的目的是数据库无关,因为我实现将支持SQL服务器,Oracle,DB2和Sybase。上面的“top N”的sql语法只是一个例子。
- 该表可以包含数百万行。
- N是一个比较小的数字,例如, 100.
- 行在队列中时,状态为0。稍后它会更改为1以指示它正在处理中。处理后它被删除。因此,预计表格中至少90%的行将具有状态0.
- 表中的行应根据其日期取得,因此应该取
order by
子句。
什么是使此查询最快的最佳索引?
我最初认为该指数应该在(date, status)
,但我不知道它了。由于状态列将大部分为零,是否有附加值?单独索引(date)
是否足够?
或者它应该是(status, date)
?
90%的行将*的状态= 0。我不想重构模式,整个问题是从表中获取记录,更改status = 1,然后进行一些处理。处理完成后,这些记录将被删除。为了确保高可用性,我会定期扫描表,查找状态为1的记录,这些记录没有经过处理(例如,服务器在读取后出现故障) – Yoni
您可以尝试按状态字段对分区表进行分区。所以你将有逻辑上1个表格存储在2个分区。据我所知,大多数RDMS支持分区... – a1ex07