Cognos更新问题之利用Transform实现Cube增量更新

浏览: 3223

   本人从事BI行业已经2年半了,也是从今年起开始负责了一些部门内的需求开发。之前一个report如何做,一个cube如何做可以说都是和公司的前辈们学习的死死的步骤(也可以说是比葫芦画瓢),只可以这么形容了。如今是前辈们走的走,有的是已经不再从事这些BI中的体力活儿了。于是我也开始负责一些项目开发的东西,心里还是感到很欣慰的,因为一件事情只有自己真正的去做了,才可以学习到更多的知识。言归正传,我们直接入主题吧。

    最近两周以来,开发了四五个数据量较大的cube,大概每次更新都是千万级别的数据。有一种感觉,也许从事BI行业的朋友们都曾经历过。创建cube的时候眼睁睁的看着他在哪里跑,却不知道什么时候可以跑完。速度是真的很慢,很慢。这个情况在去年的时候也遇到过,记忆中那个时候也就那么一两个。这样的数据无非是维度很多,关系很复杂的模型。生成Cube时候就很慢很慢,这也给每天cube的批量更新造成了时间压力,长时间的更新缓慢,客户难免的要抱怨的。所以考虑到失态严重,需要想办法解决了。

分析:为什么会这么慢?

重点在于cube的更新模式上面,最近才发现去年半年内cognos做的报表差不多都是全量更新的.模式就是:

读取全部数据源(iqd,平面,package)→更新cube生成mdc→覆盖原来目录的mdc重新发布。等于说是每次对(整个关联表)做了一次重新的关联。也可以说是把整个表重新的跑了一遍。随着时间的累计,表中数据越来越多,千万级以上的数据每天更新起来肯定很慢了的。

如果每天只更新前一天的数据,比如昨天数据过来了,今天只更新昨天的数据。刨除以前的覆盖mdc方式去update 已经存在的mdc.这样效率就快起来了。

解决步骤:

(1):说到cube增量更新在cognoschina上面也有很多说法,比如http://www.cognoschina.net/club/viewthread.php?tid=11614

 

看到这个很是高兴,于是乎就去修改了自己的模型。如下图

设置完毕,下方的红色圈圈 增量更新的属性勾上。保存,再次更新模型。出现下面结果。。

纠结了,这时才知道幸福没有那么容易。于是乎继续看帖子等回复。

http://www.cognoschina.net/club/viewthread.php?tid=26449&from=favorites

知道今天上午也没有人回复那个帖子了,我是在想高人都深藏不漏,深怕知识外流啊..也可能是高人没有看到吧。总之这个问题纠结了一天多。

TR的‘?’里面涉及的也有TR系列的错误和解释。但是唯独没有TR2747这个错误,无奈了。于是乎就去www.cognos.com寻求帮助。搜了下TR2747可以看到如下解释:

 

http://www-01.ibm.com/support/docview.wss?uid=swg21348860

Problem(Abstract)

Error

(TR2747) Dimension 'dimensionname' contains a unique level with unique move specified. This model contains an incremental update cube. Any unique moves will invalidate this cube.

Resolving the problem

This error will occur if the unique move option is selected when you are trying to incrementally update a cube. Transformer cannot make a unique move on the data that is already in the cube and allowing the addition of the new data would cause an uniqueness error.

红色部分是官网给出的解释,注意红色部分。大概的意思就是 unique  move 选项被选中所以到此增量更新发生问题。OK 问题找到

返回模型做以下修改。

move选项勾掉,其他不变(注意所有维度都要这么操作,有几个维度勾掉几个)保存再次更新cube  OK 提示create cube  is  succseeful!

步骤总结如下~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第一:确保每次数据源取出的数据都是新的数据,保证本次更新的数据在cube里面不存在。保证数据的正确性。如下面的操作。。

本人IQD数据源:Mysql数据库,在IQD文件中加入

WHERE datekey=DATE_FORMAT(DATE_ADD(SYSDATE(),INTERVAL -1 DAY),'%Y%m%d')

当前时间减去1

第二:更改PowerCube的Processing属性:把This cube is incremenally updated属性勾选上

第三:打开维度视图-Dimension-map 选中当前维度的最基层(最基础比如是年-季度-日)那么日的那一层就是最基层。

双击打开属性勾去Move属性。注意的是此模型存在的所有维度都要做这个操作。

第四:保存修改的模型,就可以生成Cube了。

效果:两次手动更新,第一次数据源选择20120702的 第二次数据源选择20120703的结果是第一次更新后模型里面可以看到0702的数据,第二次更新后可以看到0702和0703的数据就是说在原来0702的上面insert进去了0703日的数据。加上自动更新cube的脚本。每天增量更新cube的功能就实现了。

备注:由于时间仓促,此文如有不完善的地方和理解错误的地方请各位同学谅解~本人希望大家关于cube增量更新的其他方法就此讨论一下,比如cube group这些了,这次就分享到这里了。

推荐 1
本文由 kingwang 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册