0

我知道有很多批量插入脚本,因为我是 pl/sql 的新手,所以我很困惑。我有两个表 TABLEA(id,name,sirname,age) TABLEB(id,age),我想将所有数据从 TABLEB 迁移到 TABLEA。

我找到了一个链接http://psoug.org/reference/array_processing.html,其中“FORALL Insert”解释了如何做到这一点。但它假设两个表列类型相同。但就我而言,我将复制到 TABLEA 上的某些列。

由于 TABLEB 有 3000 万的记录,因此性能很重要。我想说的另一件事是 TABLEB 是外部表,我的意思是它是从 txt 文件将适当的列映射到表中创建的。

那么可以做些什么来为我的案例修改以下脚本。

CREATE TABLE servers2 AS
SELECT *
FROM servers
WHERE 1=2;

DECLARE
 CURSOR s_cur IS
 SELECT *
 FROM servers;

 TYPE fetch_array IS TABLE OF s_cur%ROWTYPE;
 s_array fetch_array;
BEGIN
  OPEN s_cur;
  LOOP
    FETCH s_cur BULK COLLECT INTO s_array LIMIT 1000;

    FORALL i IN 1..s_array.COUNT
    INSERT INTO servers2 VALUES s_array(i);

    EXIT WHEN s_cur%NOTFOUND;
  END LOOP;
  CLOSE s_cur;
  COMMIT;
END;
4

2 回答 2

4

可能最快的方法是使用带有 APPEND 提示的普通旧 INSERT:

 INSERT /*+APPEND*/ INTO table_a(id,age)
  SELECT id, age
  FROM table_b;

无需 FORALL / BULK COLLECT 等。

于 2013-08-30T09:25:17.520 回答
0

您不必为外部表更改任何内容。由于您有 30M 数据,因此您可能可以将限制增加到 100000。但这完全取决于您的数据库设计以及您拥有多少流量。但我更喜欢增加限制。

于 2013-08-30T09:32:43.863 回答