【问题标题】:Better insert option?更好的插入选项?
【发布时间】:2015-08-05 15:23:52
【问题描述】:

我正在处理从远程数据库向本地数据库插入 300 万行。

我试过了

选项 1:

insert into lic(field1,field2...field47)
    select * from lic@remote;

选项 2:

DECLARE
    TYPE T_ARRAY_NUMBER   IS TABLE OF NUMBER ;
    TYPE T_ARRAY_VARCHAR2 IS TABLE OF VARCHAR2(60) ;
    T_ARRAY_FUENTE     T_ARRAY_VARCHAR2 ;
    T_ARRAY_MODULO  T_ARRAY_VARCHAR2 ;

    CURSOR CUR IS
        SELECT FUENTE,MODULO
        FROM LICENCIAS@REMOTE 
        WHERE TO_CHAR(FECHA_PAGO,'yy')='12' and     to_char(fecha_pago,'MM')='02' ;
    BEGIN
        OPEN cur ;
       LOOP

       FETCH CUR BULK COLLECT INTO T_ARRAY_FUENTE , T_ARRAY_MODULO
       LIMIT 100;

       FORALL I IN 1 .. T_ARRAY_FUENTE.COUNT
           INSERT INTO BULK
           VALUES (T_ARRAY_FUENTE(I) , T_ARRAY_MODULO(I)); 

       EXIT WHEN cur%NOTFOUND ;

       END LOOP ;
       COMMIT ;
       CLOSE CUR ;
   END ;

这两个选项都花费了太多时间。

任何建议都会很好。

【问题讨论】:

  • 两个数据库的连接情况如何?够快吗?你在哪个平台?如果它是 Unixy 的东西,你也许可以通过 netcat 或类似的东西使用带有命名管道的数据泵。
  • 这是一次性活动还是您的应用程序逻辑的一部分。如果是前者,您可以使用 ssms 导入/导出向导简单地导入数据。
  • 服务器 sql 获取表的脚本。并在本地sql中执行
  • 不太可能有比您最初的insert ... select 更有效的 SQL 或 PL/SQL 选项。表有多大,数据库之间有多少带宽,需要多长时间,需要多长时间?您要解决的潜在业务问题是什么?这是一次性要求还是持续要求?如果它是持续进行的,您是否可以使用一些不同的复制技术(流、物化视图等)在持续的基础上进行增量复制?
  • 您可以尝试将 BULK collect LIMIT 增加到 500 或 1000 吗?如果可用,您也可以尝试 Informatica BI 工具,因为 Informatica 使用其内置缓存

标签: sql plsql oracle11g insert


【解决方案1】:

大部分缓慢可能是由于通过网络发送数据,但您可以随时尝试在插入中添加附加提示以查看是否有帮助。

insert /*+ APPEND */ into lic(field1,field2...field47)
    select * from lic@remote;

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多