我正在使用批量插入和预准备语句将数据插入到Netezza中。但是,性能非常慢。以下是我的代码:
ng-init
有谁知道如何加快速度?
答案 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);