c# - 从暂存到仓库执行 ETL 的最佳策略

标签 c# sql t-sql etl staging-table

我正在构建一个 C# 控制台应用程序,在我们想要传输大量员工数据的场景中,该应用程序将由 SQL Server 代理执行:

  1. 两个不同网络上具有相同架构的两个员工表(从一个 SQL Server 实例到第二个 SQL Server 实例)之间。

  2. 同一 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/

相关文章:

c# - 显示两个字符串之间的交集

c# - 为什么我的内部数组没有被反序列化?

php - 如何对数据库表中的数据进行随机排序并将结果插入到其他表中

mysql - 更改 mysql 中的连接

c# - 将指数转换为整数

c# - 将 EF Core 列/字段指定为只读

mysql - 在 php-my-admin 中创建触发器

sql - 获取之前的分数

sql-server - SQL 两条Select命令一张单表输出

linq - 使用 ORM 和 LINQ 在架构上是否不合理?