【发布时间】:2012-08-14 01:43:48
【问题描述】:
我有两个应用程序:第一个应用程序在 MyTable 表中插入数据。第二个以块的形式读取 MyTable 表的行:假设每次读取 1000 行。第二个应用程序必须按时间顺序读取数据,并使用类似于以下内容的查询:
SELECT
C1,
C2
FROM
(
SELECT
rownum AS RowNumber,
C1,
C2
FROM
MyTable
WHERE
C3 = :C3
AND IsProcessed = 0
ORDER BY
Timestamp
) temp
WHERE
temp.RowNumber <= 1000
查询有效,但是当表中有大量未处理的行(例如1000万行)等待时,它很慢(超过一分钟,通常只需要几秒钟即可执行)MyTable。我想这是正常的,因为 Oracle 必须首先按时间顺序对所有相关行进行排序...... 所以我的问题是:有没有更好的方法来编写这个查询?
【问题讨论】:
-
为了确定,您在
IsProcessed和Timestamp列上确实有适当的索引? -
是的,存在相应的索引。
-
“当很多...时很慢” 定义“慢”和“很多”。您的查询看起来很合理,但我们在谈论什么数据?另外,你在做软删除吗? (已处理)。
-
能否提供一个执行计划?谁更新
IsProcessed并且他们经常提交?请注意,在长时间运行的批处理中,从具有较长 UNDO/REDO 日志(大量写入后很少提交)的表中进行选择可能会导致 Oracle 中的大量负载 -
@tbone :我更新了我的问题。
标签: sql oracle query-optimization