与单个表并行插入的最快方法

时间:2012-06-19 02:46:17

标签: sql sql-server parallel-processing blocking

我的公司被共生伙伴关系所诅咒变成了寄生虫。为了从寄生虫获取我们的数据,我们必须使用非常缓慢的odbc连接。我最近注意到,虽然我可以通过并行运行查询来获得更多的吞吐量(即使在同一个表中)。

我想从中提取数据并将其移动到本地表中,这是一个特别大的表。并行运行查询我可以更快地获取数据,但我也想象这可能会导致尝试将多个查询中的数据同时写入同一个表中的问题。

对于如何最好地处理这种情况,您可以给我什么建议,以便我可以利用并行使用查询的速度提升?

编辑:我在这里得到了一些很好的反馈,但我想我并不完全清楚我是通过链接服务器(使用odbc驱动程序)来提取数据的。换句话说,这意味着我可以运行正常的INSERT语句,我相信它会提供比SqlBulkCopy或BULK INSERT更好的性能(实际上,我不相信BULK INSERT甚至可以选择)。

3 个答案:

答案 0 :(得分:12)

您是否阅读过Load 1TB in less than 1 hour

  
      
  1. 运行与可用CPU一样多的加载进程。如果你有   32个CPU,运行32个并行负载。如果您有8个CPU,则运行8并行   负荷。
  2.   
  3. 如果您可以控制输入文件的创建,请制作它们   一个大小可以被你负载线程的数量整除   想要并行运行。还要确保所有记录都属于一个记录   如果要使用交换机分区策略,请进行分区。
  4.   
  5. 如果您正在运行该过程,请使用BULK insert而不是BCP   SQL Server机器。
  6.   
  7. 使用表分区获得另外8-10%,但仅限于您的输入   保证文件与您的分区功能相匹配,这意味着   一个文件中的所有记录必须位于同一分区中。
  8.   
  9. 使用TABLOCK避免时间锁定行。
  10.   
  11. 使用ROWS PER BATCH = 2500,或者如果你是这样的话   将多个流导入一个表。
  12.   

对于SQL Server 2008,在某些情况下您可以使用minimal logging for a standard INSERT SELECT

  

SQL Server 2008增强了它可以用最少的方法处理的方法   日志记录。它支持最低限度记录的常规INSERT SELECT   声明。另外,打开跟踪标志610允许SQL Server   2008支持针对新密钥的非空B树的最小日志记录   导致分配新页面的范围。

答案 1 :(得分:4)

如果您希望在代码即c#中执行此操作,则可以选择使用SqlBulkCopy(在System.Data.SqlClient命名空间中),因为本文建议可以并行执行此操作。

http://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html

答案 2 :(得分:1)

如果您已升级到SQL 2014,则可以并行插入(兼容级别必须为110)。看到这个: http://msdn.microsoft.com/en-us/library/bb510411%28v=sql.120%29.aspx