Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SQL中向表中插入大量记录的最快方法_Java_Sql Server_Performance_Large Data Volumes - Fatal编程技术网

Java 在SQL中向表中插入大量记录的最快方法

Java 在SQL中向表中插入大量记录的最快方法,java,sql-server,performance,large-data-volumes,Java,Sql Server,Performance,Large Data Volumes,问题是,我们有大量的记录(超过一百万条)要从Java应用程序插入到单个表中。这些记录是由Java代码创建的,它不是从另一个表中移动的,因此INSERT/SELECT没有帮助 目前,我的瓶颈是INSERT语句。我使用PreparedStatement来加快进程,但在普通服务器上每秒记录的次数不能超过50次。该表一点也不复杂,并且没有定义索引 这个过程花费的时间太长,所花的时间会产生问题 我可以做些什么来获得可能的最大速度(每秒插入) 数据库:MS SQL 2008。应用程序:基于Java,使用Mi

问题是,我们有大量的记录(超过一百万条)要从Java应用程序插入到单个表中。这些记录是由Java代码创建的,它不是从另一个表中移动的,因此INSERT/SELECT没有帮助

目前,我的瓶颈是INSERT语句。我使用PreparedStatement来加快进程,但在普通服务器上每秒记录的次数不能超过50次。该表一点也不复杂,并且没有定义索引

这个过程花费的时间太长,所花的时间会产生问题

我可以做些什么来获得可能的最大速度(每秒插入)


数据库:MS SQL 2008。应用程序:基于Java,使用Microsoft JDBC驱动程序。

您研究过批量操作吗?

批量插入。也就是说,一次只发送1000行,而不是一次发送一行,因此可以大大减少往返/服务器调用

JDBC驱动程序的MSDN上。这是不需要重新设计就可以使用真正的批量方法的最简单方法

必须对每个插入进行分析、编译和执行。批处理意味着更少的解析/编译,因为1000个(例如)插入将一次性编译

有更好的方法,但如果您仅限于生成插入,这是可行的

这意味着您的方法将发生重大变化,您将生成一个带分隔符的文件,并使用外部实用程序导入数据。但是,这是将大量记录插入Sql Server数据库的最快方法,并将使加载时间加快许多数量级


此外,这是您必须执行的一次性操作还是定期执行的操作?如果是一次,我建议您甚至不要编写此过程,而是使用db实用程序的组合执行导出/导入。

您考虑过使用吗?

使用-它是专为满足您的要求而设计的,显著提高了插入速度

此外,(如果您真的没有索引),您可能还需要考虑<强> >添加/强>索引-一些索引(大部分是主键上的索引)可以改善插入的性能。


您应该能够插入记录的实际速率将取决于确切的数据、表结构以及SQL server本身的硬件/配置,因此我无法给出任何数字。

我建议使用ETL引擎。你可以用。它是免费的。ETL引擎经过优化,可以对数据进行批量加载,也可以进行任何形式的转换/验证。

表上是否有任何完整性约束或触发器?
如果是这样的话,在插入之前删除它会有所帮助,但您必须确保自己能够承担后果。

我会尝试,我想这将是我最好的解决方案。唯一的问题是我必须创建文件,然后运行操作,我还必须针对文件存储和网络条件可能出现的不同情况编写代码。我认为往返时间只是延迟的一小部分,因为每秒50个事务,每个查询运行需要20毫秒。往返时间小于1ms。我已经做了其他优化来消除往返,但没有多大帮助。除非对插入进行批处理,否则很大一部分SQL内部处理将更加高效。是吗?@Irchi:每个插入都必须被解析、编译和执行。批处理意味着更少的解析/编译,因为1000个(例如)插入将在一个批处理中编译go@Irchi:在使用BCP方法重新设计代码之前,我会尝试这种方法。这种方法更有效的原因之一是mysql查询解析器不必解析每个查询。我将一段Java代码(与群集mysql对话)改为使用1000的批插入,速度提高了100倍(10000%),我一直在测试这一点,并注意到如果我设置conn.setAutoCommit(false),性能将从25行/秒提高到107行/秒;这似乎是一个必要的设置,在MSDN链接中没有提到……我实际上在PK上有一个聚集的索引,并且数据是按PK顺序插入的,所以我认为这不会有任何影响。我将尝试批量插入,我想这是我的解决方案。谢谢,我想这也会有帮助。但我会先尝试批量插入,这似乎更有希望!有两个FK约束,我打算删除它们并尝试一下。但是bulkinsert有忽略约束的选项,所以我想使用bulkinsert将具有我需要的所有优势。