使用表级锁定并行导入数据

MicrosoftSQL Server 允许多个客户端“并行地大容量导入数据”到单个无索引的表中。这样可以提高大容量导入操作的性能。并行数据导入由三个大容量导入命令支持完成:bcpBULK INSERT 和 INSERT...SELECT * FROM OPENROWSET(BULK...)。

注意注意

只有那些使用基于 ODBC 或 SQL OLE DB 的 API 的应用程序才可以将数据并行加载到一个表中。任何基于 MicrosoftSQL Server 6.5 或更低版本附带的 DB-Library 客户端库的应用程序,包括 bcp 实用工具,都不能参与将数据并行加载到 SQL Server 实例中的操作。

如果未指定 TABLOCK 选项/提示,多个并发大容量导入流将会获取低于表级粒度的锁。并发大容量加载流可能会相互阻塞,这取决于数据的分布情况。因此,通常使用 TABLOCK 以并行方式将数据大容量导入无索引的表中。

当使用 TABLOCK 以并行方式将数据大容量导入 SQL Server 实例时,请考虑下列事项:

  • 最简单的数据并行导入方案是将数据加载到无索引的表(即“堆”)中。

  • 如果表没有索引,请指定 TABLOCK 选项用于大容量导入操作。有关详细信息,请参阅控制大容量导入的锁定行为

    注意注意

    如果表有索引,则不能通过使用 TABLOCK 选项来执行并行加载操作。同样,如果未指定 TABLOCK,则并发线程彼此阻塞。在执行大容量导入操作前,请考虑从表中删除索引。有关是保留还是删除索引的信息,请参阅优化大容量导入指南

  • 将多个客户端上要导入的数据分为与客户端数目相同的数据文件。将每个文件分别放置在每个客户端上。

    **最佳方法:**若要最有效地使用处理器,请在客户端之间均匀分配数据。如果要将数据文件以并行方式从多个客户端导入到 SQL Server 实例中,请确保数据文件大小相似。否则,负荷少的客户端线程可能会先完成,从而造成客户端的 CPU 利用率不高。

  • 为了实现最佳性能,为每个客户端指定的批处理大小应与客户端数据文件的大小相同。有关详细信息,请参阅管理大容量导入的批处理

将数据大容量导入到表中以后,可以按照以下步骤创建任何所需的索引:

  1. 从单一客户端依次创建每个聚集索引。有关详细信息,请参阅创建聚集索引

  2. 创建非聚集索引。您可以从不同的客户端并行创建这些索引。有关详细信息,请参阅创建非聚集索引

如果未指定 TABLOCK,则可以通过并行方式大容量导入数据,而不考虑目标上的索引数量。但是在这种情况下,不可能执行大容量优化,所以在从各行或各页上获取锁时,可能出现阻塞。