我正在构建一个 C# 控制台应用程序,在我们想要传输大量员工数据的场景中,该应用程序将由 SQL Server 代理执行:
两个不同网络上具有相同架构的两个员工表(从一个 SQL Server 实例到第二个 SQL Server 实例)之间。
同一 SQL Server 实例上的两个员工表之间(无网络延迟),一个表是临时表,另一个表是仓库。
该过程是连续的,因此 ETL 作业必须首先传输 #1,然后传输 #2。
考虑到进程 #1 是跨网络的,而进程 #2 涉及在将新数据传输到目标表之前删除目标表,我想知道为了获得最佳性能而采用的最佳策略是什么。
这是我想做的事情:
流程#2:
BEGIN TRANSACTION EmployeesInsert
WITH MARK N'Transfering employees from Staging to Warehouse';
GO
USE CorporateWarehouse;
GO
DELETE FROM CorporateWarehouse.WarehouseEmployee
INSERT INTO CorporateWarehouse.WarehouseEmployee
(FirstName,
LastName,
Address,
PhoneNumber)
SELECT FirstName,
LastName,
Address,
PhoneNumber
FROM CorporateWarehouse.StagingEmployee
GO
COMMIT TRANSACTION EmployeesInsert;
GO
最佳答案
在考虑了 SSIS、BCP 和链接服务器之后,我最终决定使用 SqlBulkCopy
类来实现解决方案。从通过 GetUserDataReader() 方法获取的用户列表开始,该方法返回 IDataReader
类型对象。
选择此选项是因为 UseInternalTransaction
选项,您可以显式使其在自己的事务中执行:
var usersDataReader = _warehouseRepository.GetUserDataReader();
var connectionString = ConfigurationManager.ConnectionStrings["CorporateWarehouse"].ToString();
using (var bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.TableLock))
{
bulkCopy.BatchSize = extractInfo.BatchSize;
bulkCopy.BulkCopyTimeout = extractInfo.BatchTimeout;
bulkCopy.DestinationTableName = "StagingEmployee";
try
{
bulkCopy.WriteToServer(usersDataReader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
usersDataReader.Close();
}
}
关于c# - 从暂存到仓库执行 ETL 的最佳策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24934903/