使用表级锁定并行导入数据
更新日期: 2005 年 12 月 5 日
Microsoft SQL Server 允许多个客户端“并行地大容量导入数据”**到单个无索引的表中。这样可以提高大容量导入操作的性能。并行数据导入由三个大容量导入命令支持完成:bcp、BULK INSERT 和 INSERT...SELECT * FROM OPENROWSET(BULK...)。
注意: |
---|
只有那些使用基于 ODBC 或 SQL OLE DB 的 API 的应用程序才可以将数据并行加载到一个表中。任何基于 Microsoft SQL Server 6.5 或更低版本附带的 DB-Library 客户端库的应用程序,包括 bcp 实用工具,都不能参与将数据并行加载到 SQL Server 实例中的操作。 |
如果未指定 TABLOCK 选项/提示,多个并发大容量导入流将会获取低于表级粒度的锁。并发大容量加载流可能会相互阻塞,这取决于数据的分布情况。因此,通常使用 TABLOCK 以并行方式将数据大容量导入无索引的表中。
当使用 TABLOCK 以并行方式将数据大容量导入 SQL Server 实例时,请考虑下列事项:
- 最简单的数据并行导入方案是将数据加载到无索引的表(即“堆”**)中。
- 如果表没有索引,请指定 TABLOCK 选项用于大容量导入操作。有关详细信息,请参阅控制大容量导入的锁定行为。
注意: 如果表有索引,则不能通过使用 TABLOCK 选项来执行并行加载操作。同样,如果未指定 TABLOCK,则并发线程彼此阻塞。在执行大容量导入操作前,请考虑从表中删除索引。有关是保留还是删除索引的信息,请参阅优化大容量导入指南。 - 将多个客户端上要导入的数据分为与客户端数目相同的数据文件。将每个文件分别放置在每个客户端上。
**最佳方法:**若要最有效地使用处理器,请在客户端之间均匀分配数据。如果要将数据文件以并行方式从多个客户端导入到 SQL Server 实例中,请确保数据文件大小相似。否则,负荷少的客户端线程可能会先完成,从而造成客户端的 CPU 利用率不高。 - 为了实现最佳性能,为每个客户端指定的批处理大小应与客户端数据文件的大小相同。有关详细信息,请参阅管理大容量导入的批处理。
将数据大容量导入到表中以后,可以按照以下步骤创建任何所需的索引:
如果未指定 TABLOCK,则可以通过并行方式大容量导入数据,而不考虑目标上的索引数量。但是在这种情况下,不可能执行大容量优化,所以在从各行或各页上获取锁时,可能出现阻塞。
请参阅
概念
创建索引(数据库引擎)
在大容量导入中按最小方式记录日志的前提条件
优化大容量导入性能
其他资源
bcp 实用工具
BULK INSERT (Transact-SQL)
FROM (Transact-SQL)
OPENROWSET (DMX)
INSERT (Transact-SQL)
SELECT (Transact-SQL)
表提示 (Transact-SQL)