MS SQL 批量 update\insert
MS SQL Bulk update\insert
前段时间我们面临批量 insert\update 到 MS SQL 数据库的问题。
任务非常简单 - 从数据库中检索数据,执行数据转换并更新父项 table 并填写子项 table。数据量巨大,这就是为什么我们对最高效的方式感兴趣。在数据库中做任何事情(存储过程、文件处理等)不适用,因为我们需要从第三方应用程序获取信息。
虽然在网上可以找到很多关于如何禁用自动提交和执行批处理的文章inserts\updates,但无论如何它都会一个一个地发送请求。
这适用于大多数免费 jdbc 驱动程序,包括最流行的驱动程序 - net.sourceforge.jtds.jdbc.Driver (http://sourceforge.net/p/jtds/discussion/129584/thread/8e89906c/)。
DataDirect 可能支持此类功能,但它不是免费的。猜猜 - List of JDBC drivers for SQL Server 2008 (comparison)。
请分享解决类似问题的经验。
此致,
亚历克斯
我们用其他方式解决了这个问题。由于我们需要批量执行 2 条数据修改(插入新的子记录并使用某些字段更新现有父记录),因此我们重写了查询以执行此操作:
更新:
UPDATE ParentTable SET DeviceInformation = dual.DeviceInformation FROM ParentTable ptb
JOIN ( values (1, 'info1'), (2, 'info2')) as dual (ParentTableID, DeviceInformation)
ON ptb.ParentTableID = dual.ParentTableID
同样的想法 INSERT:
INSERT INTO dbo.ChildTable
(ChildId, ChildNumber, Info)
values (1, 1, 'some text'), (2, 2, 'some text2')
它给我们带来了显着的性能提升,因为大部分时间都花在了连接建立上。
希望对您有所帮助。
前段时间我们面临批量 insert\update 到 MS SQL 数据库的问题。
任务非常简单 - 从数据库中检索数据,执行数据转换并更新父项 table 并填写子项 table。数据量巨大,这就是为什么我们对最高效的方式感兴趣。在数据库中做任何事情(存储过程、文件处理等)不适用,因为我们需要从第三方应用程序获取信息。
虽然在网上可以找到很多关于如何禁用自动提交和执行批处理的文章inserts\updates,但无论如何它都会一个一个地发送请求。 这适用于大多数免费 jdbc 驱动程序,包括最流行的驱动程序 - net.sourceforge.jtds.jdbc.Driver (http://sourceforge.net/p/jtds/discussion/129584/thread/8e89906c/)。 DataDirect 可能支持此类功能,但它不是免费的。猜猜 - List of JDBC drivers for SQL Server 2008 (comparison)。
请分享解决类似问题的经验。
此致,
亚历克斯
我们用其他方式解决了这个问题。由于我们需要批量执行 2 条数据修改(插入新的子记录并使用某些字段更新现有父记录),因此我们重写了查询以执行此操作:
更新:
UPDATE ParentTable SET DeviceInformation = dual.DeviceInformation FROM ParentTable ptb
JOIN ( values (1, 'info1'), (2, 'info2')) as dual (ParentTableID, DeviceInformation)
ON ptb.ParentTableID = dual.ParentTableID
同样的想法 INSERT:
INSERT INTO dbo.ChildTable
(ChildId, ChildNumber, Info)
values (1, 1, 'some text'), (2, 2, 'some text2')
它给我们带来了显着的性能提升,因为大部分时间都花在了连接建立上。
希望对您有所帮助。