我有一个程序需要对许多非常大的 Oracle 表(最大的有数千万行)运行查询。这些查询的输出被馈送到另一个进程(作为副作用)可以记录查询的进度(即,最后一行获取)。
如果任务由于某种原因中途停止,它可以重新启动,那将是很好的。为此,查询必须以一致的顺序返回行,因此必须对其进行排序。显而易见的事情是对主键进行排序;但是,与未排序的解决方案相比,这可能会在性能(索引访问)方面受到惩罚。鉴于重启可能永远不会发生,这是不可取的。
是否有一些技巧可以确保以另一种方式进行一致的排序?在这种情况下保持性能的任何其他建议?
编辑:我一直在环顾四周,看到提到“按 rowid 排序”。这有用甚至可能吗?
EDIT2:我添加了一些基准:
- 无订单:17 秒。
- 通过 PK 订购:46 秒。
- 按 rowid 排序:43 秒。
因此,任何 order by 都会对性能产生严重影响,而使用 rowid 几乎没有什么区别。公认的答案是 - 没有简单的方法可以做到这一点。