2

我正在构建一个 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
4

1 回答 1

2

在考虑了 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();
    }
}
于 2014-07-29T19:03:54.867 回答