问题是,我们有大量的记录(超过一百万)从Java应用程序插入到单个表中。记录是由Java代码创建的,它不是从另一个表移动的,所以INSERT / SELECT不会有帮助。
目前,我的瓶颈是INSERT语句。我正在使用PreparedStatement来加速这个过程,但我不能在普通服务器上每秒获得超过50个recods。该表根本不复杂,并且没有定义索引。
这个过程耗时太长,花费的时间会产生问题。
我可以做些什么来获得最高速度(每秒INSERT)?
数据库:MS SQL 2008.应用程序:基于Java,使用Microsoft JDBC驱动程序。
答案 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数据库的最快方法,可以将加载时间加快许多个数量级。
此外,这是您必须执行的一次性操作还是定期发生的操作?如果有一次我建议甚至不编码这个过程,而是使用数据库实用程序的组合执行导出/导入。
答案 6 :(得分:0)
我建议使用ETL引擎。您可以使用Pentaho。免费。 ETL引擎经过优化,可以对数据进行批量加载,也可以进行任何形式的转换/验证。