当前位置: 首页 > 知识库问答 >
问题:

当从Java插入到SQL Server时,我可以获得类似于“批量插入”的速度吗?

张建华
2023-03-14

从Java插入时,插入速度约为每秒2500行。即使在我测量for循环之后和ExecuteBatch之前的时间时也是如此。因此“创建”内存中的数据并不是瓶颈。

使用批量插入进行插入时,插入速度约为每秒30000行。

这两个测试都是在服务器上完成的。所以网络也不是瓶颈。为什么批处理插入更快,有什么线索吗?如果在Java中也能获得同样的性能呢?

CREATE TABLE TestTable   
   (  Col1 varchar(50)
    , Col2 int);  
// 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();
// 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';

共有1个答案

那铭
2023-03-14

虽然大容量插入是进行大容量插入的最快方式,但SQL Server支持通过本机驱动程序和ODBC进行远程(客户端驱动的)大容量插入操作。从JDBC驱动程序的4.2版开始,该功能通过SQLServerBulkCopy类公开,该类不直接从文件读取,但支持从RowsetResultSetISQLServerBulkRecord自定义实现读取生成的数据。此功能等效于。NETSQLBulkCopy类,具有基本相同的接口,应该是执行大容量操作的最快方式,而不是基于服务器的大容量插入

编辑:示例按OP

下面您可以找到一个示例用例,可以用来测试SQLServerBulkCSVFileRecord的性能,SQLServerBulkCopy是一个类似于SQLServerBulkCopy的方法,只是它从文本文件读取。在我的测试用例中,test.txt包含一百万行“xtab100”

CREATE TABLE TestTable (Col1 varchar(50), Col2 int);
// Make sure to use version 4.2, as SQLServerBulkCSVFileRecord is not included in version 4.1
import com.microsoft.sqlserver.jdbc.*;

long startTime = System.currentTimeMillis();
SQLServerBulkCSVFileRecord fileRecord = null;  

fileRecord = new SQLServerBulkCSVFileRecord("C:\\temp\\test.txt", true);   
fileRecord.addColumnMetadata(1, null, java.sql.Types.NVARCHAR, 50, 0);  
fileRecord.addColumnMetadata(2, null, java.sql.Types.INTEGER, 0, 0);  
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
Connection destinationConnection = DriverManager.getConnection("jdbc:sqlserver://Server\\\\Instance:1433", "user", "pass");
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();  

// Depending on the size of the data being uploaded, and the amount of RAM, an optimum can be found here. Play around with this to improve performance.
copyOptions.setBatchSize(300000); 

// This is crucial to get good performance
copyOptions.setTableLock(true);  

SQLServerBulkCopy bulkCopy =  new SQLServerBulkCopy(destinationConnection);
bulkCopy.setBulkCopyOptions(copyOptions);  
bulkCopy.setDestinationTableName("TestTable");
bulkCopy.writeToServer(fileRecord);

long endTime   = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println(totalTime + "ms");
 类似资料:
  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • 问题内容: 这是一些用一个非常简单的表设置的SQL。 然后,这会重现问题 有任何想法吗? 我认为nVarchar2有点奇怪吗?如果我将列类型更改为varChar2,则可以。可悲的是,我无法更改问题所在的实际生产数据库的列类型 问题答案: 如果将“ NAME” NVARCHAR2(255)更改为“ NAME” VARCHAR2(255)(即通过使用varchar2),则不会有任何问题。您可以在htt

  • 本文向大家介绍C#批量插入数据到Sqlserver中的三种方式,包括了C#批量插入数据到Sqlserver中的三种方式的使用技巧和注意事项,需要的朋友参考一下 本篇,我将来讲解一下在Sqlserver中批量插入数据。 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引。GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表

  • 我正在向CouchBase批量插入数据,几分钟后出现了这个异常: 我做错什么了吗?

  • 问题内容: 我是Sql的新手,但是将excel文档中的1000多个行插入到我的数据库中的最佳方法是什么(Sql Server2008。) 例如,我正在使用以下查询: 这很好用,但是插入1000条记录是有限制的,我有19000条记录,我真的不想做19条单独的插入语句,还有另一个问题,那就是公司ID总是相同的,那么有没有更好的方法呢写了19000次吗? 问题答案: Microsoft提供了带有SQL

  • 就集成测试而言,Wiremock确实非常强大。我喜欢Wiremock在不改变beans的情况下处理< code>URL响应的方式(我们在mockito或powermock中进行单元测试的方式)。 在集成测试中,我希望所有3个层都得到测试并模拟外部依赖 是否可以对 Spring 启动测试、mockito 或 powermock 做同样的事情(因为我已经在使用它们,只是不想向项目添加新库) 以下是我们