开篇介绍
假设在业务中也有这样的一个需求,再从数据源抽取数据到目标表比如 Staging 表时,需要记录每次抽取的条数改如何实现?实际上,实现的方式也很多种,这取决于你的日志系统的设计与架构。这个案例只是简单的用到 SSIS 中的一个可以记录行数的控件 Row Count 来实现一下这个需求。
Row Count 的使用
首先我们有一张记录表插入条数的日志表,功能非常简单,就是记录在哪一批次的执行下,位于哪个包的表插入日志记录。
IF OBJECT_ID('T039_ROWCOUNT_LOG','U') IS NOT NULL
DROP TABLE T039_ROWCOUNT_LOG
GO
CREATE TABLE T039_ROWCOUNT_LOG
(
EXECUTION_ID NVARCHAR(255),
PACKAGE_NAME NVARCHAR(255),
TABLE_NAME NVARCHAR(225),
INSERTED_COUNT BIGINT,
INSERTED_DATE DATETIME
)
比如插入的测试结果如下:
实现过程
在包中先定义一个变量,这个变量就是用来记录插入的条数。
拖放一个 Row Count 控件到源与目标控件之间。
双击编辑 Row Count 控件,选择之前创建好的变量。这样当从 FF_SRC_INTERNET_SALES 文件数据源向 OLE_DST_INTERNET_SALES 目标写入数据的时候,ROW_COUNT 就会记录所有的条数。
当 DFT_LOAD_INTERNET_SALES 数据流结束之后,变量已经获取到插入的条数,因此可以直接通过 Execute SQL Task 向日志表中插入这次条数的信息。
编辑 EST_INSERT_TABLE_COUNT_LOG 的 SQL 语句,表的名称是 Hard Code 硬编码的,这一点要注意。也就是说,一个 Execute SQL Task 只为一个表负责,并且每一个 Execute SQL Task 只紧跟在当前需要记录表插入条数的 Data Flow Task 数据流之后。
参数的配置。
保存并运行包。
那么每次包运行抽取数据的记录都会被插入到日志表中,每次写入的条数也可以被记录下来了。
总结
这个例子比较简单,只是单纯的记录一下写入的条数,基于这个非常基础的案例可扩展的日志内容还有很多,实现的方式也有很多种,因为一个完整的数据仓库日志系统是包含很多方面的:
系统方面
- 包执行状态,包中各层级任务执行状态(正常,错误,取消),时长等日志信息。
- 数据源端数据变化日志信息,每天,每月重点数据源表,文件数据量变化日志信息。
- 数据仓库维度,事实每天,每周,每月的数据量变化日志信息。
- 数据库文件,每天,每周,每月的数据量变化日志信息。
业务方面
- 重点业务数据的增长对数据仓库事实表,维度表的增长状态的关联信息。
- 不同时间阶段业务数据的增长与数据仓库事实表,维度表在不同周期增长的关联信息。
报表方面
- 不同业务报表的分布情况,访问量,周期性的访问频率等等。
有了这些体系,我们才能对我们的数据仓库了如指掌!可以更好的维护,管理,预判业务的增长量对数据仓库的影响等等有着非常至关重要的作用,包括对包,任务,报表的调优都可以起到非常大的作用,可以说是基于 BI 的 BI 系统。