各位大佬。
老弟有个问题。我是银行里面的报表开发人员。就是用oracle进行报表开发的时候会出现某家机构由于业务量少导致有些维度没有数据。这样就导致报表开发的时候没办法统计到该维度的数据。但是由于报表样式都是行里给的所以需要按照行里的样子把报表展示出来。如果没有数据也要把报表样子显示出来。这样就出现由于后台没有数据,但报表要把数据展示出来的情况。目前我解决的办法是。用事实表和维度表关联,没有关联条件,让他产生笛卡尔积。然后在通过产生的笛卡尔积数据和原来的事实表进行minus。来达到补全维度的数据。但是这样做有个问题,通过笛卡尔积出来的结果集数据量特别大。从而导致查询很慢。情况就是这么个情况。
因为我们是给银行出报表而且银行数据量比较大。我取数的明细表有1到2亿左右的数据。通过汇总和一些报表逻辑加工,我的事实表在没进行补全维度之前处理完之后就已经是2000W条数据了。而且维度表需要展示50项的维度。这样就导致进行笛卡尔积的时候数据量就是2000W*50=10W亿的数据。我这个补全维度的sql处理完大概要30分钟。有没有老哥提供一种补全维度的思路。可以将时间压缩到10分钟内。因为我的这个报表处理最慢的Sql就是补全维度哪里,其他逻辑处理通过oracle开个并行1分钟基本解决。
上面说的都是数据库里面数据加工情况。
我们这边报表开发工具用的是cognos。虽然cognos里面可以通过表的关联以及前台页面传入参数确定唯一的一组报表展示的数据(举个例子,因为报表在看的时候客户一般要选择日期机构,币种,等选择条件。通过这些条件关联我的事实表最后查出的数据就是50条。因此可以通过cognos的外连接来实现我上面的补全维度情况。。但是我不想改cognos。我想知道oracle里面处理补全维度的这种情况应该如何来处理。)但是我希望知道在不改cogons的情况下。在oracle把补全维度处理好。求老哥給个思路。

解决方案 »

  1.   

    你说的外连接我知道。这个可以在cognos里面实现。但是oracle这边外连接使用会有问题的。因为我们取得数据并不是一家银行是好多行的数据都要取的。我的事实表最后会有好多机构的数据,但是通过他们前台吧过滤条件去掉之后,就只有50条。如果按你说的外连接我这边要写循环的。我感觉那样更慢。