0

我目前正在将文件中的数据插入表中。我在将数据插入表格之前格式化数据(删除标签/回车/获取某些文本的字符代码等)。首先,我必须检查记录是否存在,如果存在则更新它。如果不是,则必须将该记录插入到表中。

我遇到的问题是它需要很长时间。我有两个文件,一个有不到 50 万条记录,一个有超过 400 万条记录。如果可以运行批量收集以便我两者都做?

例如

open c_cur;
loop
  fetch c_cur bulk collect into examp limit 50000;
  exit when limit.count = 0
  forall x in 1..limit.count
    update table1
    set...
    where...

    if sql%notfound then
      insert into table1
      values (...)
    end if;
  commit;
end loop;
close c_cur;

这可能吗?

我还听说过设置临时表并将文件转储到那里,然后从那里开始工作。那是更好的选择吗?这会给我带来多少性能提升?

我也不想从文件中对表进行合并。

谢谢。

4

2 回答 2

0

最好的方法是根据文件设置外部表(您必须确保数据库服务器可以看到存储文件的目录)。这样,您就可以直接针对外部表执行 MERGE 语句(不需要批量收集等;这仍然是逐行的方法,即使效率稍高一些)。

下一个最好的(恕我直言)是将文件中的数据加载到临时表中,然后根据临时表执行合并语句。

于 2015-01-26T13:14:18.823 回答
0

您可以使用 sql%bulk_rowcount

--after forall update:
for i in 1..examp.count loop
  if sql%bulk_rowcount(i) > 0 then
    examp.delete(i); -- record already updated - remove it from array
  end if;
end if;

-- loop only non-deleted elements here
forall i in indicies of examp
  insert into ....
于 2015-01-26T15:11:23.290 回答