首页 > 解决方案 > 将具有 180 万行的 Oracle 查询分成 40,000 个行块

问题描述

我有一个项目,我从一个系统获取文档并将它们导入另一个系统。

第一个系统存储了文档和相关的关键字。我有一个查询将返回结果,然后将其用作索引文件以将它们导入新系统。涉及大约 180 万个文档,因此这意味着 180 万行(每个文档一个)。

我需要将返回的结果分成 40,000 个块,以便一次分批导入 40,000 个,而不是长时间导入。

我有查询返回我需要的结果。只需要知道如何接受它并将其分解以便于导入。如果我包含的信息很少,我深表歉意。这是我第一次来这里寻求帮助。

标签: sqloracle

解决方案


使用内置函数ORA_HASH将行划分为行数大致相同的 45 个桶。例如:

select * from some_table where ora_hash(id, 44) = 0;
select * from some_table where ora_hash(id, 44) = 1;
...
select * from some_table where ora_hash(id, 44) = 44;

该函数是确定性的,并且对于相同的输入总是返回相同的结果。结果数字以 0 开头——这对于散列来说是正常的,但对于 Oracle 来说是不寻常的,因此查询一开始可能看起来不一样。哈希对更多不同的值更有效,因此如果可能,请传入主键或另一个唯一值。不要使用低基数列,如状态列,否则存储桶将不平衡。

这个过程在某些方面效率很低,因为您要重新阅读同一张表 45 次。但是由于您正在处理文档,我认为表格扫描不会成为这里的瓶颈。


推荐阅读