1. 什么是SQL Server数据泵?
SQL Server 数据泵是一种高速的数据导入操作。数据泵使用可扩展性和并行化组件,以及基于列存储技术的批处理框架,使数据加载速度更快,并且避免在表或索引更改时的数据复制。
数据泵能够提高数据导入的速度和可伸缩性,特别是对于大量数据导入。使用数据泵可以在目标服务器上生成表并插入数据,也可以进行列映射,并支持数据转换和验证。
2. 使用SQL Server数据泵的优点
2.1 高速数据导入
数据泵使用批处理框架,同时利用并行化组件和基于列的存储技术,在导入数据时比常规SQL 执行更快 faster。它充分利用CPU、磁盘和内存资源,并在加载数据时最小化数据移动和日志写入。
2.2 避免数据复制
数据泵采用高级可扩展性和并行化组件,并处理批量数据,而不是使用插入行复制操作。这使得它更加容错,并允许在表或索引更改时执行导入操作。
2.3 适用于复杂数据转换
数据泵具有列映射、数据转换和验证工具,可对源数据进行分隔、转换和合并处理,并将其转换为目标数据类型、格式和结构。
3. 使用SQL Server数据泵进行数据转移的步骤
3.1 创建源表
首先,需要在源数据库中创建用于导出数据的表。它可以是用户定义的表,也可以是系统表。在下面的示例中,我们将使用 AdventureWorks 样例数据库中的 Sales.SalesOrderDetail 表。
USE [AdventureWorks]
GO
SELECT * INTO dbo.SalesOrderDetailSource FROM Sales.SalesOrderDetail
该语句会从 Sales.SalesOrderDetail 表中选择所有行,并将其插入到名为 dbo.SalesOrderDetailSource 的新表中。
3.2 创建目标表
接下来,需要在目标数据库中创建用于导入数据的表。在此示例中,我们将在本地 SQL Server 实例上创建名为 dbo.SalesOrderDetailTarget 的表。
USE [myTargetDB]
GO
CREATE TABLE dbo.SalesOrderDetailTarget
(
SalesOrderID INT NOT NULL,
ProductID INT NOT NULL,
OrderQty SMALLINT NOT NULL,
UnitPrice MONEY NOT NULL,
Discount MONEY NOT NULL,
CONSTRAINT PK_SalesOrderDetailTarget PRIMARY KEY CLUSTERED (SalesOrderID, ProductID)
)
另外,在目标表上必须设置适当的索引以提高查询性能。上面的代码中,我们创建了聚集索引以根据 SalesOrderID 和 ProductID 进行快速查询。
3.3 使用数据泵导出数据
下一步就是使用数据泵将数据从源表导出到数据文件中。
USE [mySourceDB]
GO
SELECT *
FROM dbo.SalesOrderDetailSource
ORDER BY SalesOrderID DESC, ProductID DESC
-- 按照需要指定查询条件
-- 创建数据泵作业
EXECUTE sys.sp_xtp_databasemigration_export
@export_job_name = N'SalesOrderDetailExport', -- 作业名称
@export_working_directory = N'C:\SQLData', -- 文件存放路径
@file_label = N'SalesOrderDetailData', -- 导出文件名前缀
@table_name = N'dbo.SalesOrderDetailSource', -- 数据源表名
@clickable_certificates_enabled = 1 -- 是否加密
执行SELECT语句以选择要导出的数据行,并按照需要指定查询条件。ORDER BY 是可选的,可以使用任何其他有效的 SELECT 查询。
EXECUTE sys.sp_xtp_databasemigration_export 存储过程以创建数据泵作业。
3.4 从数据文件中导入数据
最后,需要使用数据泵将数据从数据文件导入到目标表中。
-- 创建数据泵作业
EXECUTE sys.sp_xtp_databasemigration_import
@import_job_name = N'SalesOrderDetailImport', -- 作业名称
@import_working_directory = N'C:\SQLData', -- 文件读取路径
@file_label = N'SalesOrderDetailData', -- 导出文件名前缀
@table_name = N'SalesOrderDetailTarget', -- 目标表名
@keep_null = 1, -- 是否保留空值
@enable_streaming = 0 -- 是否启用数据流
该存储过程将在目标数据库上创建一个新表,以便存储通过数据泵导入的一组数据。如果要使用现有的表,请更改存储过程中的目标表名。
4. 结论
SQL Server 数据泵是一个快速和可伸缩的数据导入工具,适用于大量数据的复杂转换和验证。使用 SQL Server 数据泵可以大大加快数据导入速度,并避免在表或索引更改时的数据复制问题。