优化大容量导入性能

本主题介绍了有关对使用 bcp 命令、BULK INSERT 语句或 OPENROWSET(BULK...) 函数 (Transact-SQL) 将数据大容量导入 Microsoft SQL Server中的表这一过程进行优化的选项。若要尽可能快地大容量导入或导出数据,了解影响性能和可用于管理性能的命令限定符的因素非常重要。如果可能,使用 Transact-SQL 语句将数据大容量导入 SQL Server,因为 Transact-SQL 比 bcp 快。

注意注意

有关这些方法的比较,请参阅关于大容量导入和大容量导出操作

如何最快地提高特定大容量导入操作的性能受下列因素的影响:

  • 表是否包含约束或触发器,或者两者都有。

  • 数据库使用的恢复模式。

    有关详细信息,请参阅恢复模式概述

  • 存放复制数据的表是否为空。

  • 表是否包含索引。

  • 是否指定了 TABLOCK。

  • 从单个客户端复制数据,还是从多个客户端并行复制数据。

  • 是否在运行 SQL Server 的两台计算机之间复制数据。

重要说明重要提示

在 SQL Server 2005 和更高版本中,在启用触发器后便可使用大容量导入优化。行版本控制用于触发器并将行版本存储在 tempdb 中的版本存储区中。您可能需要增加 tempdb 的大小以适应触发器对版本存储区的影响,才能使用触发器大容量导入大批数据记录。

有关这些因素如何影响大容量导入方案的信息,请参阅优化大容量导入指南

优化大容量导入的方法

若要加快大容量导入数据的速度,SQL Server 提供了下列方法:

  • 使用最小日志记录

    简单恢复模式按最小方式记录大多数大容量操作。

    对于完整恢复模式下的数据库,大容量导入期间执行的所有行插入操作被完整地记录到事务日志中。如果数据导入量较大,会导致迅速填满事务日志。对于大容量导入操作,按最小方式记录比完整记录更有效,并减少了大容量导入操作填满日志空间的可能性。若要对通常使用完整恢复模式的数据库按最小方式记录大容量导入操作,可以先将数据库切换到大容量日志恢复模式。在大容量导入数据之后,将恢复模式切换回完整恢复模式。有关详细信息,请参阅有关从完整恢复模式或大容量日志恢复模式切换的注意事项

    注意注意

    如果优化的大容量记录适用,则插入的行将按最小方式记录;否则,插入的行将完全记录在事务日志中。有关何时记录大容量导入操作以及如何执行按最小方式记录的大容量导入操作的信息,请参阅可以尽量减少日志量的操作在大容量导入中按最小方式记录日志的前提条件

  • 将数据从多个客户端并行导入到单个表

    SQL Server 允许将数据从多个客户端并行大容量导入到单个表。三个大容量导入机制都支持并行导入数据。这可以提高数据导入操作的性能。

    有关详细信息,请参阅使用表级锁定并行导入数据

  • 使用批处理

    有关导入数据时使用批处理的信息,以及有关用于管理批处理的命令限定符的信息,请参阅管理大容量导入的批处理

    注意注意

    OPENROWSET 子句的 BULK 选项不支持批大小控制。

  • 禁用触发器

    禁用触发器可能会提高性能。

    有关触发器执行对大容量导入操作的影响以及如何启用或禁用触发器的详细信息,请参阅导入大容量数据时控制触发器执行

  • 禁用约束

    有关约束检查对大容量导入操作的影响以及如何启用或禁用表的 CHECK 约束和 FOREIGN KEY 约束的信息,请参阅通过大容量导入操作控制约束检查

  • 对数据文件中的数据排序

    默认情况下,大容量导入操作假定数据文件未排序。如果表具有聚集索引,则使用 bcp 实用工具、BULK INSERT 语句和 OPENROWSET(BULK…) 函数 (Transact-SQL) 即可指定大容量导入操作期间数据文件中数据的排序方式。根据需要,可以将数据文件中的数据按表中相同的顺序进行排序。但是,如果为数据文件和表指定相同的顺序,则可以提高大容量导入操作的性能。

    有关详细信息,请参阅控制大容量导入数据时的排序顺序

  • C控制锁定行为

    有关如何指定大容量导入操作期间的锁定行为的信息,请参阅控制大容量导入的锁定行为

  • 导入本机格式数据

    有关详细信息,请参阅使用本机格式导入或导出数据使用 Unicode 本机格式导入或导出数据