在我寻求从JAVA到SQL Server中获取数据的最快方法的过程中,我注意到我能够使用的最快的JAVA方法仍然比使用BULK INSERT慢12倍。从JAVA插入到SQL Server中时,能否获得“BULK INSERT”类似的速度?
我的数据是从JAVA内部生成的,BULK INSERT只支持从文本文件中读取数据,所以除非我将数据输出到临时文本文件,否则使用BULK INSERT不是一个选项。反过来,这当然会是一个巨大的表现。
从JAVA插入时,插入速度大约为每秒2500行。 即使当我测量之后的 for循环,并在executeBatch之前。因此,“创建”内存中的数据不是瓶颈。
使用BATCH INSERT插入时,插入速度大约为每秒30000行。
这两项测试都在服务器上完成。所以网络也不是瓶颈。有关为什么BATCH INSERT速度更快的线索?而且,如果从JAVA内部可以获得相同的性能?
这只是一个需要加载一次的大数据集。因此,这将是确定临时禁用任何类型的日志(已经尝试过简单的日志),禁用索引(表有没有),锁定,什么的,......
我的测试设置到目前为止
数据库:
CREATE TABLE TestTable
( Col1 varchar(50)
, Col2 int);
JAVA:
// This seems to be essential to get good speeds, otherwise batching is not used.
conn.setAutoCommit(false);
PreparedStatement prepStmt = conn.prepareStatement("INSERT INTO TestTable (Col1, Col2) VALUES (?, ?)");
for (int i = 1; i <= 10000; i++) {
prepStmt.setString(1,"X");
prepStmt.setInt(2,100);
prepStmt.addBatch();
}
prepStmt.executeBatch();
conn.commit();
BULK INSERT:
// A text file containing "X 100" over and over again... so the same data as generated in JAVA
bulk insert TestTable FROM 'c:\test\test.txt';
10000行的批处理量非常大,通过每隔100行执行一个'executeBatch()'就可以获得更好的性能。 – Kayaman
@Kayaman:建议的Thx。刚刚通过100行100行进行测试。相同的速度....或缺乏。 – Wouter
@TT .:我们的服务器有400GB的RAM。我认为我们在问题的内存方面没问题;) – Wouter