一尘不染

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

sql

我的公司被寄生的共生伙伴关系所诅咒。要从寄生虫获取数据,我们必须使用痛苦缓慢的odbc连接。我最近确实注意到了,尽管通过并行运行查询(即使在同一张表上)也可以获得更高的吞吐量。

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

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

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


阅读 127

收藏
2021-03-17

共1个答案

一尘不染

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

  1. 运行与可用CPU数量一样多的加载过程。如果您有32个CPU,请运行32个并行负载。如果您有8个CPU,请运行8个并行负载。
  2. 如果可以控制输入文件的创建,则将它们的大小均匀地除以要并行运行的加载线程数。如果要使用切换分区策略,还请确保所有记录都属于一个分区。
  3. 如果在SQL Server计算机上运行进程,请使用BULK插入而不是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树的最小日志记录,以记录导致分配新页面的新键范围。

2021-03-17