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

C# 执行从暂存到仓库的ETL的最佳策略,c#,sql,tsql,etl,staging-table,C#,Sql,Tsql,Etl,Staging Table,我正在构建一个C#控制台应用程序,在需要传输大量员工数据的情况下,该应用程序将由SQL Server代理执行: 在从一个SQL Server实例到另一个SQL Server实例的两个不同网络上具有相同架构的两个雇员表之间 在同一SQL Server实例上的两个employee表之间(无网络延迟),一个表是临时表,另一个是仓库 该过程是连续的,因此ETL作业必须先传输1,然后传输2 考虑到进程#1是跨网络的,而进程#2涉及在将新数据传输到目标表之前删除目标表,我想知道为了获得最佳性能,应该采取什么

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

  • 在从一个SQL Server实例到另一个SQL Server实例的两个不同网络上具有相同架构的两个雇员表之间

  • 在同一SQL Server实例上的两个employee表之间(无网络延迟),一个表是临时表,另一个是仓库

  • 该过程是连续的,因此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
    

    在考虑SSI、BCP和链接服务器之后,我最终决定使用
    SqlBulkCopy
    类实现一个解决方案。从GetUserDataReader()方法获得的用户列表开始,该方法返回
    IDataReader
    type对象

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

    是否有理由不使用SSIS或BCP进行批量加载?客户端未使用该技术删除语句是否触发任何触发器?如果不是,为什么不使用
    截断表CorporateWarehouse.warehouse employee
    @DanielE。很好的一点,我将明确使用'截断表'而不是你能做一个“链接服务器”?快得多。我们每天大约在13秒内将4个不同表中的400万条记录通过互联网连接传输到另一个站点。这比我们以前处理文件的方式要好得多。讨厌!