管理大容量导入的批处理

本节介绍如何管理为大容量导入操作确定批处理大小的方式。默认情况下,数据文件的所有行都作为未知大小的单个批处理在单个事务中导入。在这种情况下,如果导入操作在完成之前失败,则会回滚整个事务,并且不会将任何数据添加到目标表中。失败的操作必须随后从数据文件的开始位置重新启动。

将大型数据文件作为单个批处理导入可能会出现问题,因此,可以使用 bcp 和 BULK INSERT 通过一系列批处理导入数据,每个批处理的大小都小于该数据文件。每个批处理都将导入并记录在一个单独的事务中,提交完给定的事务后,由该事务导入的行也将提交。如果操作失败,则只会回滚通过当前批处理导入的行,您可以从失败批处理的开始位置而不是从数据文件的开始位置恢复导入数据的操作。

ms188267.note(zh-cn,SQL.90).gif注意:
有关批处理如何工作的信息,请参阅批处理

另外,如果选择不限制批处理大小,则可通过在命令中估计数据文件的大小来提高性能。为该操作创建查询计划时,查询处理器会使用该估计值。

ms188267.note(zh-cn,SQL.90).gif注意:
指定批处理大小或数据文件大小时,不要求很准确。

下表汇总了支持这些方法的限定符。

命令

批处理大小

每批发送的行数

每批发送的千字节数

bcp1

-bbatch_size

-h "ROWS_PER_BATCH = bb"

-h "KILOBYTES_PER_BATCH = cc"

BULK INSERT2

BATCHSIZE = batch_size

ROWS_PER_BATCH = rows_per_batch

KILOBYTES_PER_BATCH = kilobytes_per_batch

ms188267.note(zh-cn,SQL.90).gif注意:

如果将此选项与 BATCHSIZE 一起使用,会生成错误。

INSERT ... SELECT * FROM OPENROWSET(BULK...)

—3

ROWS_PER_BATCH = rows_per_batch

—3

1 在 bcp 命令中,不要同时使用 -bbatch_size 开关和 ROWS_PER_BATCH 或 KILOBYTES_PER_BATCH 提示。组合使用这些开关和提示将导致错误。

2 在 BULK INSERT 命令中,如果将 BATCHSIZE 与 ROWS_PER_BATCH 或 KILOBYTES_PER_BATCH 一起使用,则优先使用 BATCHSIZE。

3 OPENROWSET 既没有 BATCHSIZE 选项,也没有 KILOBYTES_PER_BATCH 选项。

下列各节介绍了这些限定符的使用方法。

指定批处理的近似大小

导入大量行时将数据分成若干批处理具有很多优点。每个批处理完成后,都会记录事务。如果由于某种原因,大容量导入操作尚未完成即终止,只会回滚当前的事务(批处理)。

ms188267.note(zh-cn,SQL.90).gif注意:
大容量日志记录在事务日志中包含了所导入数据的副本。这会导致日志快速增长,不过,可以在每个批处理后备份日志以回收日志空间。

若要通过指定了近似大小的一系列批处理来导入数据文件,请使用以下限定符:

  • 对于 bcp-b
  • 对于 BULK INSERT:BATCHSIZE

每一批行均作为单独的事务插入。如果由于某种原因,大容量导入操作尚未完成即终止,只会回滚当前的事务。例如,如果数据文件包含 1000 行,而使用的批处理大小为 100,则 Microsoft SQL Server 会将该操作作为 10 个单独的事务来记录,每个事务将 100 行插入到目标表中。如果大容量导入操作在加载到 750 行时终止,则 SQL Server 回滚当前事务时只会删除此前的 49 行。目标表中仍会包含前 700 行。

SQL Server 根据批处理大小的值自动优化加载操作,从而优化性能。一般来说,应该使批处理大小尽可能大。通常,批处理的大小越大,大容量导入操作的性能就越好。但是,也存在少数例外情况。如果目标表上存在一个或多个索引,则较大的批处理大小在排序时会对内存产生压力。同时,如果执行并行加载时未使用 TABLOCK 选项,较大的批处理大小会导致更多的阻塞。

ms188267.note(zh-cn,SQL.90).gif注意:
将数据从 SQL Server 实例大容量导出到数据文件中时,批处理大小不适用。

指定数据文件的近似大小

如果未指定大容量导入操作的批处理大小,可以指明数据文件的近似大小,使查询处理器在查询计划中有效地分配资源。若要指明数据文件的近似大小,请估计行数或数据的千字节数,如下所示:

  • 估计每批的行数
    若要估计行数,请使用 ROWS_PER_BATCH 提示或选项。如果指定的值 > 0,则查询处理器将使用 ROWS_PER_BATCH 的值作为在查询计划中分配资源的提示。此值应该与实际的行数具有相同的顺序。
    尽管数据文件中的所有行在一个批处理中复制到 SQL Server 实例中,但是 bcp 每发送 1000 行,就会显示“已将 1000 行发送到 SQL Server”的消息。此消息仅供参考,并且使用任何大小的批处理均会出现。
  • 估计每批的千字节数
    若要以千字节数估计数据文件的大小,请使用 KILOBYTES_PER_BATCH 提示或选项。SQL Server 将根据指定的值优化大容量导入操作。
ms188267.note(zh-cn,SQL.90).gif注意:
如果在未指定批处理大小或任何大容量日志记录优化的情况下大容量导入大型数据文件,事务日志可能会在大容量导入操作完成之前就填满。若要避免这种情况,可以扩大事务日志或允许其自动增长。

请参阅

概念

优化大容量导入性能

其他资源

BACKUP (Transact-SQL)
bcp 实用工具
BULK INSERT (Transact-SQL)
ImportRowsPerBatch Property
OPENROWSET (Transact-SQL)
sp_dboption (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助