测量 SSIS 数据流的进度

Posted

技术标签:

【中文标题】测量 SSIS 数据流的进度【英文标题】:Measuring Progress of SSIS Data Flow 【发布时间】:2010-12-01 07:10:54 【问题描述】:

我正在运行一个 SSIS 包以从一个平面文件加载一百万行,该文件使用脚本任务进行复杂的转换和 SQL Server 表目标。我试图找出在数据流处理期间将行数(可能以 1000 的倍数更有效)写入不同表的最佳方法(嗯,现阶段的任何方法)。这样我就可以通过定期查询表来确定可能需要几分钟的任务的进度百分比。

我似乎无法将任何 SQL 任务添加到流程中,所以我猜测唯一的方法是连接到 .NET 脚本中的 SQL 数据库。这似乎很痛苦,我什至不确定这是否可能。还有其他更优雅的方式吗?我已经看到对“Rows Read”性能计数器的引用,但不确定我在 SSIS 中的何处访问它,并且仍然不确定如何在数据流处理期间将其写入 SQL 表。

任何建议表示赞赏。

格伦

【问题讨论】:

【参考方案1】:

这里有两个简单的选择:

选项 1:使用 SSIS 的内置日志记录并观察正在进行的事件。这可以配置为记录到多个不同的输出,包括关系数据库和平面文件

查看更多Here

选项 2:您可以添加一个 SSIS 脚本组件,该组件可以向外部系统(如数据库表)发出通知

【讨论】:

好吧,他的问题是如何做到这一点。不是吗? 杰森,谢谢。我已经查看了日志记录。不幸的是,OnProgress 事件在数据流开始时触发一次,然后再也不会触发。我看不到在每行或以其他方式在整个数据流中不断触发的另一个事件。我开始认为选项2是一种可能性。你能建议一些代码来建立连接吗?问题在于,在数据流中有一个“后退”对象模型。 Dts之类的东西。对象根本不像它们在控制流中那样存在。有用,我知道。所以让数据库连接工作很困难。有什么建议吗?【参考方案2】:

我最近以稍微不同的方式解决了这个问题,我发现这比使用脚本和在代码中打开与 DB 的单独连接更好:

在源查询或变换形状中,添加行数(增量) 在条件分支中,只要数字是例如 1000 的倍数,就使用模表达式 (%) 进行分支,但这可以是可配置的或基于源数据(例如数据的 0.0% 到 100.0%) 创建日志连接管理器并使用目标。控制批处理大小,以便将行立即提交到目标表。

【讨论】:

【参考方案3】:

为什么不编写一个 .NET 应用程序,您可以将其集成到其中以获取有关 SSIS 包所在位置的信息。

基本上所有发送到控制台的内容都是您可以获得的,并且您可以附加事件处理程序以在它处理包时获取信息。

这里有一个链接可以帮助您采用这种方法: http://www.programminghelp.com/database/sqlserver/sql-server-integration-services-calling-ssis-package-in-c/

【讨论】:

【参考方案4】:

好的,终于成功了....在脚本组件中添加了对以下子的调用:

Sub UpdateLoadLog(ByVal Load_ID As Int32, ByVal Row_Count As Int32, ByVal Row_Percent As Int32, ByVal connstr As String)
    Dim dbconn As OleDbConnection
    Dim Sql As String
    Dim dbcomm As OleDbCommand

    dbconn = New OleDbConnection(connstr)
    dbconn.Open()
    Sql = "update myTable set rows_processed = " & Row_Count & ", rows_processed_percent = " & Row_Percent & " where load_id = " & Load_ID & " and load_log_type = 'SSIS'"
    dbcomm = New OleDbCommand(Sql, dbconn)
    dbcomm.ExecuteNonQuery()

    dbconn.Close()
    dbconn = Nothing
    dbcomm = Nothing
End Sub

每 1000 行执行一次,并成功更新表。该行在包开始时在控制流中创建时已经存在,并在最后的控制流中再次更新为最终行数和 100%。

感谢大家的建议。

【讨论】:

【参考方案5】:

使用行数的应用程序是 .net 应用程序吗?在应用程序之间共享信息时,有很多公认的做法。也许你应该看看他们。对于您的特定情况,如果是.net 应用程序使用此行号来计算进度,您可能可以将信息存储在数据库表以外的其他位置,例如文件系统、Web 服务、Windows 环境变量、日志(像 Windows 事件日志)等是我现在想到的一些。我认为在脚本组件中使用行计数形式更新 Windows 环境变量将是一个足够好的解决方案。就像使用全局变量在程序内的两个函数之间共享数据一样。 :)

【讨论】:

以上是关于测量 SSIS 数据流的进度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用请求测量下载速度和进度?

为啥我们需要 SSIS 和数据仓库的星型模式?

安装SSIS包中的数据流任务

更改 SQL 列的数据类型时更新 SSIS 包

来自_Choose Toolbox Items_的Visual Studio 2013中缺少SSIS数据流项目和SSIS控制流项目选项卡

使用SSIS同步数据库数据