2

尝试将 CLOB 从一个数据库复制到另一个数据库时,我发现 Oracle (11g) 的性能很差。我已经尝试了几件事,但无法改善这一点。

CLOB 用于收集报告数据。在逐个记录的基础上,这可能非常大。我正在远程数据库(通过 WAN)上调用一个程序来构建数据,然后将结果复制回公司总部的数据库进行比较。一般格式为:

CREATE TABLE my_report(the_db VARCHAR2(30), object_id VARCHAR2(30), 
final_value CLOB, CONSTRAINT my_report_pk PRIMARY KEY (the_db, object_id));

为了获得性能,我将远程站点的结果累积到表的远程副本中。在程序运行结束时,我尝试将数据复制回来。这个查询很简单:

INSERT INTO my_report SELECT * FROM my_report@europe;

我看到的性能约为每秒 9 行,平均 CLOB 大小为 3500 字节。(我使用的是 CLOB,因为这个大小通常超过 4k,这是 VARCHAR2 的限制。)对于 70,000 条记录(并不罕见),传输大约需要 2 小时。我尝试过使用该create table as select方法,但这获得了相同的性能。我还花了几个小时调整 SQL*NET,但没有看到任何改进。更改 Arraysize 不会提高性能(尽管如果值减小它可以降低它。

我可以使用旧的 exp/imp 方法(从远程导出表,然后将其重新导入)获取副本,它运行得更快,但这对于我的自动报告来说是相当手动的。我考虑过尝试编写一个流水线函数来从中选择这些数据,使用它将 CLOBS 拆分为 BYTE/VARCHAR2 块(带有额外的块编号列),但如果有人尝试过并发现,我不想这样做一个问题。

谢谢你的帮助。

4

1 回答 1

0

当将数组大小增加到 1500 或更高时,我能够获得更好的性能。另见附件:http ://www.fors.com/velpuri2/PERFORMANCE/SQLNET.pdf

于 2013-10-17T20:37:16.897 回答