关于大容量导入和大容量导出操作

SQL Server 支持从 SQL Server 表大容量导出数据以及将数据大容量导入 SQL Server 表或未分区的视图。可以使用下列基本方法:

方法

说明

导入数据

导出数据

bcp 实用工具

大容量导出数据和大容量导入数据并生成格式化文件的命令行实用工具 (Bcp.exe)。

支持

支持

BULK INSERT 语句

将数据直接从数据文件导入数据库表或未分区视图的 Transact-SQL 语句。

支持

不支持

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

通过在 INSERT 语句中指定 OPENROWSET(BULK…) 函数来选择数据,从而使用 OPENROWSET 大容量行集提供程序将数据大容量导入 SQL Server 表的 Transact-SQL 语句。

支持

不支持

限制

SQL Server 大容量导入操作不支持从逗号分隔值 (CSV) 文件中导入数据。但是对于 32 位系统,通过使用 OPENROWSETOLE DB Provider for Jet 可以将 CSV 数据导入 SQL Server 表,但是没有大容量导入优化。通过由位于数据源所在目录的 schema.ini 文件定义的架构,Jet 将文本文件作为表处理。对于 CSV 数据,schema.ini 文件内的其中一个参数将是“FORMAT=CSVDelimited”。若要使用此解决方案,您需要了解 Jet Test IISAMm 如何工作,例如它的连接字符串语法、schema.ini 用法、注册表设置选项等等。此信息的最佳来源是 Microsoft Access 帮助和知识库 (KB) 文章。有关详细信息,请参阅初始化文本数据源驱动程序如何将 SQL Server 7.0 分布式查询用于安全的 Access 数据库的链接服务器以及如何使用 Jet OLE DB Provider 4.0 连接到 ISAM 数据库如何使用 Jet 访问接口的文本打开带分隔符的文本文件

进程内与进程外操作

BULK INSERT 语句和 OPENROWSET(BULK) 函数通过 SQL Server 在进程内执行,共享同一内存地址空间。因为数据文件是通过 SQL Server 进程打开的,所以不能在客户端进程和 SQL Server 进程之间复制数据。有关使用 BULK INSERT 或 INSERT ...SELECT * FROM OPENROWSET(BULK...) 导入数据时的安全注意事项,请参阅使用 BULK INSERT 或 OPENROWSET(BULK...) 导入大容量数据

与之相反,bcp 实用工具在进程外运行。若要跨进程内存空间移动数据,bcp 必须使用“进程间数据封送”。“进程间数据封送”是将方法调用的参数转换成字节流的过程。该过程会显著增加处理器的负荷。但是,由于 bcp 会分析数据并将数据转换为客户端进程中的本机存储格式,它可以减轻 SQL Server 进程的分析和数据转换负荷。因此,如果存在 CPU 限制,则通过使用 bcp 而非 BULK INSERT 或 INSERT ... SELECT * FROM OPENROWSET(BULK) 可以在具有多个 CPU 的计算机上或者在不同的计算机上实现更高的大容量导入性能。

格式化文件

bcp 实用工具、BULK INSERT 和 INSERT ...SELECT * FROM OPENROWSET(BULK...) 都支持使用专门的“格式化文件”来存储数据文件中每个字段的格式信息。格式化文件还可以包含相应的 SQL Server 表的有关信息。格式化文件可以用于提供从 SQL Server 实例大容量导出数据和向其中大容量导入数据时所需的所有格式信息。

格式化文件提供了一种解释导入期间数据文件中数据的格式以及设置导出期间数据文件中数据格式的灵活方式。这种灵活性使得解释数据时无需编写专用代码,也无需为满足 SQL Server 或外部应用程序的特殊需要而重新设置数据的格式。例如,如果将要加载的数据大容量导出到某个需要逗号分隔值的应用程序,则可以使用格式化文件将逗号作为字段终止符插入导出的数据中。

SQL Server 2005 及更高版本支持两种格式化文件:XML 格式化文件和非 XML 格式化文件。早期版本的 SQL Server 支持非 XML 格式化文件;XML 格式化文件是 SQL Server 2005 中新增的。

bcp 实用工具是唯一能够生成格式化文件的工具。有关详细信息,请参阅创建格式化文件。有关格式化文件的详细信息,请参阅用来导入或导出数据的格式化文件

注意注意

如果在大容量导出或导入操作期间未提供格式化文件,用户可以选择在命令行处覆盖默认格式。

查询处理器和大容量导入

将数据大容量导入 SQL Server 实例时,bcp 实用工具、BULK INSERT 语句和 INSERT ...SELECT * FROM OPENROWSET(BULK...) 语句都使用查询处理器。

这三种方法都可以将数据文件中的数据转换为 OLE DB 行集。但是转换方法不同,如下所示:

  • bcp 实用工具读取数据文件并将 TDS 流发送到 SQL Server 大容量复制程序 (BCP) API,该程序将数据转换为 OLE DB 行集中。

  • BULK INSERT 和 OPENROWSET 大容量行集提供程序都是直接将文件数据转换为 OLE DB 行集中。

查询处理器将 OLE DB 行集插入目标表,查询处理器将规划并优化每个操作。

性能注意事项

导入大量数据时,性能的考虑也是非常重要的。在某些情况下,可以通过更改大容量导入或大容量导出操作处理下列一项或多项内容的方式来提高性能:

  • 批处理开关

  • CHECK 约束的约束检查

  • 如何记录大容量事务。它与通常使用完整恢复模式的数据库相关。

  • 排序导出的数据

  • 并行数据导入

  • 表锁定

  • 触发器执行

有关详细信息,请参阅优化大容量导入性能

注意注意

不存在针对大容量导出操作的特殊优化技术。这些操作只是使用 SELECT 语句从源表选择数据。