我在 oracle 中有一个非常大的表,其中包含 140+ 百万行。目前,我们每晚对该表进行三次全表扫描,并使用一些结果来填充一个 tmp 表。然后将该 tmp 表变成一个非常大的报告(通常 140K + 行)。
大表称为tasklog,具有以下结构:tasklog_id (number) - PK document_id (number) date_time_in (date) + 一些不相关的行
有数百万个不同的文档 ID,每个 ID 都重复了 1 到几百次,date_time_in 是这个条目被放入数据库的时间。
所有的全表扫描看起来像这样
DECLARE
n_prevdocid number;
cursor tasks is
select *
from tasklog
order by document_id, date_time_in DESC;
BEGIN
for tk in tasks
loop
if n_prevdocid <> tk.document_id then
-- *code snipped*
end if;
n_prevdocid = tk.document_id;
end loop;
END;
/
所以我的问题是:是否有一种快速(ish)的方法来获取具有最新 date_time_in 的行的不同 document_id 列表。这可以大大加快整个过程。或者有人能想出更好的方法来每天检索这些数据吗?
可能相关的事情,这个表只插入了当前日期时间的行。它不是范围分区的,但我看不出这对我有什么帮助。不会更新或删除任何行。每天插入大约 70k - 80k 行。