【问题标题】:Best strategy to perform ETL from staging to warehouse从暂存到仓库执行 ETL 的最佳策略
【发布时间】:2014-07-24 13:20:18
【问题描述】:

我正在构建一个 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 进行批量加载?
  • 客户端未使用该技术
  • 您的 DELETE 语句会触发任何触发器吗?如果不是,为什么不使用TRUNCATE TABLE CorporateWarehouse.WarehouseEmployee
  • @DanielE。好点,我肯定会改用“TRUNCATE TABLE”
  • 你能做一个“链接服务器”吗?快多了。我们每天在大约 13 秒内通过 Internet 连接将 4 个不同表中的大约 400 万条记录传输到另一个站点。这比我们过去对文件所做的事情要好得多。糟糕!

标签: c# sql tsql etl staging-table


【解决方案1】:

在考虑了 SSIS、BCP 和链接服务器之后,我最终决定使用 SqlBulkCopy 类实施解决方案。从返回IDataReader类型对象的GetUserDataReader()方法获取的用户列表开始。

选择此选项是因为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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多