在SQL中将非常大量的记录插入表中的最快方法

时间:2010-05-04 14:15:33

标签: java sql-server performance large-data-volumes

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

目前,我的瓶颈是INSERT语句。我正在使用PreparedStatement来加速这个过程,但我不能在普通服务器上每秒获得超过50个recods。该表根本不复杂,并且没有定义索引。

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

我可以做些什么来获得最高速度(每秒INSERT)?

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

7 个答案:

答案 0 :(得分:10)

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

MSDN上的

Performing Batch Operations用于JDBC驱动程序。这是最简单的方法,无需重新设计即可使用真正的批量方法。

必须解析并编译和执行每个插入。批处理意味着解析/编译的次数要少得多,因为一次编译1000个(例如)插入

有更好的方法,但如果您仅限于生成的INSERT

,则此方法有效

答案 1 :(得分:6)

使用BULK INSERT - 它专为您提出的问题而设计,显着可提高插入速度。

另外,(以防万一你确实没有索引)你可能还想考虑添加索引 - 一些索引(主键上的大多数索引)可以提高性能插入

您应该能够插入记录的实际速率取决于确切的数据,表格结构以及SQL服务器本身的硬件/配置,因此我无法真正给您任何数字。< / p>

答案 2 :(得分:2)

您是否考虑了批量操作bulk operations

答案 3 :(得分:1)

您是否考虑过使用batch updates

答案 4 :(得分:1)

表上是否存在完整性约束或触发器? 如果是这样,在插入之前放下它会有所帮助,但你必须确保你能承担后果。

答案 5 :(得分:0)

查看Sql Server's bcp utility.

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

此外,这是您必须执行的一次性操作还是定期发生的操作?如果有一次我建议甚至不编码这个过程,而是使用数据库实用程序的组合执行导出/导入。

答案 6 :(得分:0)

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

相关问题