gpt4 book ai didi

sql - 我可以向 Oracle 发送 "batched"INSERT 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:40 25 4
gpt4 key购买 nike

场景:

  • 我每天将一些数据加载到本地 MySQL 数据库中,大约 200 万行;
  • 我必须(必须 - 这是审计/监管方面的事情)转移到“适当”管理的服务器,目前看起来是 Oracle 10g;
  • 服务器在不同国家:网络往返电流需要60-70毫秒;
  • 输入是一个非规范化形式的 CSV 文件:我在加载之前对数据进行规范化,每行通常会在最多 4 个表中产生 3-8 个 INSERT;
  • 加载脚本目前使用 ActiveRecord 和 fastercsv 在 Ruby 中实现。我已经尝试过 ar-extensions gem,但它假定 MySQL 样式的多值子句想法会起作用。它没有。

编辑:已经非常有用的答案 - 谢谢!关于那个讨厌的输入文件的更多信息。字段的数量是可变的,位置也发生了几次变化——我当前的脚本通过分析标题行来确定内容(好吧,fastercsv 和一个狡猾的转换器可以做到这一点)。因此,如果没有多个版本的加载文件,直接上传和后处理 SQL 将无法工作,这很糟糕。它也是一个德语 CSV 文件:分号分隔(没什么大不了的)和逗号指示的小数点(相当大的问题,除非我们加载为 VARCHAR 并随后进行文本处理 - 呃)。

问题:

以大约 7 秒/秒的速度加载 200 万行将花费超过 24 小时的时间!这可能是日常流程的缺点,更不用说用户希望能够在数据以 CSV 格式可用后大约 5 小时访问数据!

我研究了每次网络旅行应用多个插入:相当笨拙的 INSERT ALL... 语法会很好,除了目前我正在使用一个序列对每一行应用一个唯一的 id .据了解

INSERT ALL
INTO tablea (id,b,c) VALUES (tablea_seq.nextval,1,2)
INTO tablea (id,b,c) VALUES (tablea_seq.nextval,3,4)
INTO tablea (id,b,c) VALUES (tablea_seq.nextval,5,6)
SELECT 1 FROM dual;

(我说过这很笨拙吗?)尝试对所有三行使用相同的 ID。 Oracle 文档似乎证实了这一点。

最近的尝试是在一次执行中发送多个 INSERT,例如:

    INSERT INTO tablea (id,b,c) VALUES (tablea_seq.nextval,1,2);
INSERT INTO tablea (id,b,c) VALUES (tablea_seq.nextval,3,4);
INSERT INTO tablea (id,b,c) VALUES (tablea_seq.nextval,5,6);

我还没有找到说服 Oracle 接受的方法。

问题

  • 我是不是漏掉了一些明显的东西? (如果结果是这样,我将非常高兴!)
  • 如果我无法发送多个插入,我还能尝试什么?

为什么接受那个?

无论出于何种原因,我更愿意让我的代码尽可能不受特定于平台的构造的影响:出现此问题的一个原因是我正在从 MySQL 迁移到 Oracle;由于地理原因,有一天可能会发生另一次移动,我无法确定该平台。因此,让我的数据库库达到可以使用文本 SQL 命令实现合理缩放的程度是很有吸引力的,而 PL/SQL block 实现了这一点。现在,如果确实出现了另一个平台,更改将仅限于更改代码中的适配器:很可能是一行代码。

最佳答案

如何将 csv 文件发送到 oracle 数据库服务器,使用 SQLLoader将 csv 文件加载到临时表中,然后运行存储过程以将其转换并插入到最终表中?

关于sql - 我可以向 Oracle 发送 "batched"INSERT 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/536712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com