18

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

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

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

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

4

3 回答 3

13

您是否在不到 1 小时内阅读了 Load 1TB

  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,在某些情况下,您可以对标准 INSERT SELECT 使用最少的日志记录

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

于 2012-06-19T06:01:51.857 回答
5

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

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

于 2012-06-21T08:30:13.917 回答
2

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

于 2014-09-05T12:19:18.970 回答