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

问题描述 投票:15回答:3

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

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

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

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

sql sql-server parallel-processing blocking
3个回答
12
投票

你读过Load 1TB in less than 1 hour吗?

  1. 运行与可用CPU一样多的加载进程。如果您有32个CPU,则运行32个并行加载。如果您有8个CPU,则运行8个并行负载。
  2. 如果您可以控制输入文件的创建,请使它们的大小可以被要并行运行的加载线程数整除。如果要使用交换机分区策略,还要确保所有记录都属于一个分区。
  3. 如果在SQL Server计算机上运行该进程,请使用BULK insert而不是BCP。
  4. 使用表分区获得另外8-10%,但前提是您的输入文件是保证匹配您的分区功能,这意味着一个文件中的所有记录必须位于同一分区中。
  5. 使用TABLOCK可以避免一次锁定行。
  6. 如果要将多个流导入一个表,请使用ROWS PER BATCH = 2500或其附近的内容。

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

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


4
投票

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.