非常慢的Netezza(数据库)批量插入

时间:2015-10-12 16:25:09

标签: java sql performance insert netezza

我正在使用批量插入和预准备语句将数据插入到Netezza中。但是,性能非常慢。以下是我的代码:

ng-init

有谁知道如何加快速度?

2 个答案:

答案 0 :(得分:5)

Netezza上插入语句批次不会高性能每个查询的开销将限制这些操作的效率。我建议将您的数据转储到平面文件并执行nzload / external table insert。有关示例,请参阅Transient External Tables

答案 1 :(得分:2)

正如您可能已经知道的那样,Netezza JDBC驱动程序可能会检测到批量插入,并且会将其转换为外部表加载。

从这里的示例运行时可以看出,使用非批处理预处理语句的单例插入非常慢,而使用executebatch的插入使用批处理大小快速向上运行。

start of call to testSingletonInserts() with batchSize = 100
exec time for batch-size 100: 8193ms
end of call to testSingletonInserts()

start of call to testBatchInserts() with batchSize = 1000
exec time for batch-size 1000: 190ms
end of call to testBatchInserts()

start of call to testBatchInserts() with batchSize = 10000
exec time for batch-size 10000: 734ms
end of call to testBatchInserts()

start of call to testBatchInserts() with batchSize = 100000
exec time for batch-size 100000: 1763ms
end of call to testBatchInserts()

一般来说,我不建议批量小于10,000。

一个重要的诊断点是检查Netezza系统上的JDBC跟踪或pg.log,以验证是否为您隐式调用了外部表。

如果您看到这样的条目,那么您通过JDBC驱动程序获得隐式外部表的好处。

2015-08-08 12:52:50.640127 EDT [13898]  DEBUG:  QUERY: insert into testload (c1,c2) values (next value for testload_seq, 96)

如果您看到这样的条目,那么您将获得一个外部表格。

2015-08-08 12:52:51.078404 EDT [13898]  DEBUG:  QUERY: CREATE EXTERNAL TABLE bulkETL_13898_0 ( c0 nvarchar(5) )  USING (  DATAOBJECT('/tmp/junk')  REMOTESOURCE 'jdbc'  DELIMITER '     '  ESCAPECHAR ''\'  CTRLCHARS 'YES'  CRINSTRING 'YES'  ENCODING 'INTERNAL'  MAXERRORS 1 QUOTEDVALUE 'YES' );
2015-08-08 12:52:51.086081 EDT [13898]  DEBUG:  QUERY: insert into testload (c1,c2) values (next value for testload_seq,bulkETL_13898_0.c0)
2015-08-08 12:52:51.101234 EDT [13898]  DEBUG:  transaction 1411711 started dbos txid 0x3dc5c

如果您发现批量执行时没有获得隐式外部行为,请尝试确保连接上的自动提交已关闭。

conn.setAutoCommit(false);