Cube增量更新
1.建表:
-- 用户表
create table zuserinfo
(
zid int null,
zname varchar(50) null,
zpid int null
)
-- 订单表
create table zorderinfo
(
zid int null,
zuid int null,
zproductname varchar(50) null,
cdate date null
)
-- 增量表
create table zAddinfo
(
zid int null,
zuid int null,
zproductname varchar(50) null,
cdate date null
)
-- 注:增量表和订单表 表结构一样
用户表:zuserinfo |
||
zid |
zname |
zpid |
1 |
admin |
null |
2 |
robay |
1 |
3 |
emmy |
2 |
4 |
roem |
2 |
订单表:zorderinfo |
|||
zid |
zuid |
zproductname |
cdate |
1 |
1 |
AAA |
2011-01-05 |
2 |
1 |
BBB |
2011-01-05 |
3 |
2 |
AAA |
2010-01-06 |
增量表:zAddinfo |
|||
zid |
zuid |
zproductname |
cdate |
1 |
1 |
AAA |
2011-01-05 |
2 |
1 |
BBB |
2011-01-05 |
3 |
2 |
AAA |
2010-01-06 |
2.建ssas
数据源 数据视图 cube 维度
视图建关系时,订单表,增量表都和用户表的ID有关联,但是cube不会出现增量表哦。
3.建oracle的存储过程
create procedure zaddinfoproc
as
cursor addcursor is
-- 这里需要注意:如果查询当天的数据,会重复插入,所以最好查询前天以前的数据更新cube。
select * from zorderinfo where to_char(cdate,'yyyy-mm-dd')=to_char(sysdate-1,'yyyy-mm-dd');
begin
for addtable in addcursor loop
insert into zAddinfo(zid,zuid,zproductname,cdate) values(addtable.zid,addtable.zuid,addtable.zproductname,addtable.cdate);
commit;
end loop;
end zaddinfoproc;
4.建立oracle的job
每天定时的把 订单表中的数据 插入到 增量表中。
--每天的 10:40 执行
-- Trunc(Sysdate+1) + (10*60+40)/24*60
-- 删除数据-不会加入日志 (delete会加入日志)
truncate table zuserinfo
5.建立ssis
拖一个处理任务proces task
(先中要增量更新的cube名称,处理选项下点处理增量,设置下点配置,度量值和分区选成你要处理增量的cube,在源数据源和视图,表架构和名称 选你的事实表和增量表);
在拖一个执行sql语句 (专门用来 删除增量表的数据的)。
在项目文件夹中找到这个.dtsx文件,右键 编辑,文件 副本另存为,文件为 sql server 的文件。如果布署报错dtx:password,就把另存为时的一个选项 保护级别 :依靠服务器和存储角色 的最后一个选项。最后连上线点执行包,测试一下是否通过啦....
6.在sqlserver中添加一个job。用来定时更新cube的数据。
大家可以参考博客园的:
http://www.cnblogs.com/aspnetx/archive/2009/09/24/1573513.html
增量更新有一个缺点:
举个例子:cube存的是 2008年-2011年 的业务数据,有一天,客户说 2009年1月1号的一笔业务数据有误,把源表的数据改掉了。
那么cube如何去更新2009年1月1号这一天的数据呢?
增量更新的方式肯定不行了,在这里,要更新cube的数据,
1.只能过过全量的方式处理
2.在增量更新某一个事实表的下一步多加一个处理全表的动作。具体的步聚目前不知道如何实现。
so,出现这种问题时,如果没有一个好的方法处理的时候,就需要我们的经理或者相关负责人和客户 讲清 :
历史数据出现问题如何处理。要提前沟通好。