【发布时间】: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