sql - 将具有 180 万行的 Oracle 查询分成 40,000 个行块
问题描述
我有一个项目,我从一个系统获取文档并将它们导入另一个系统。
第一个系统存储了文档和相关的关键字。我有一个查询将返回结果,然后将其用作索引文件以将它们导入新系统。涉及大约 180 万个文档,因此这意味着 180 万行(每个文档一个)。
我需要将返回的结果分成 40,000 个块,以便一次分批导入 40,000 个,而不是长时间导入。
我有查询返回我需要的结果。只需要知道如何接受它并将其分解以便于导入。如果我包含的信息很少,我深表歉意。这是我第一次来这里寻求帮助。
解决方案
使用内置函数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 次。但是由于您正在处理文档,我认为表格扫描不会成为这里的瓶颈。
推荐阅读
- python - 如何为此特定代码在 Pygame 中模拟跳跃
- graphql - .NET GraphQL 类型:ABCModel 无法有效地强制转换为 GraphQL 类型
- javascript - 如何监听由 WebCam 错误触发的全局事件:NotAllowedError
- android - BluetoothSocket.connect() 在带有 Android 9 的三星 S9 上失败
- php - 如何提取 JSON 值并为每个值运行一个带有 curl 的 for 循环?
- wordpress - 将 Wordpress 与 Git 结合使用 - 我应该忽略哪些文件?
- c# - 强化扫描 - ASP.NET 不良做法:存储在会话中的不可序列化对象
- java - 无法写入数据,文档似乎已经关闭
- sql - 雪花,无法将分区拼花文件导入数据库
- javascript - 如何将新数据插入到 Firebase 中的确切位置