日期:2014-05-17  浏览次数:20723 次

历史库查询问题解决方案
问题是这样的:    
          原系统上线时没有考虑到历史数据转储的问题,所以没有设计历史库,也无数据仓库,在此系统已经开发了大量的查询、报表程序。    
          在系统使用一个阶段后,由于数据量太大影响效率。又增加了一个历史库,将30多张表的数据按一定规则转移到历史库中。造成的问题是大量报表需要修改,将历史库数据与生产库数据联合起来。    
解决方法:    
          首先想到的就是用union     all语句。但问题是报表太多,修改量太大。而且并不是所有的情况下都要去查历史表,有点浪费资源。    
          第二种方法是将存储过程中的语句都改为字符串,然后根据条件选用不同的表名,然后通过动态sql执行。这样虽然比较灵活,但问题是修改量并不比第一方法少,而且本人非常不愿意用这种方式。会给代码编写与调试带来很大的不便。    
          最后一种方法是我刚刚想到的,就是用同义词。首先建立一个公共同义词指向生产库用表,比如public     Orders     for     crm.orders,然后建在特定的schema下建立一个指向历史表的同义词,但名称相同,HIS.Orders     for     crm.orders@HIS_DB,所有报表程序都改为用同义词查询。如select     order_id     from     orders;默认情况下使用的都是public同义词。如果程序中判断需要历史库的数据,那么用    
      alter     session     set     current_schema=his;
将当前schema改为his,然后重新执行一下刚才的代码,这次取的就是历史表的数据了。     这样的优点的原来的代码无需太多修改。而且写新报表的时候不需要考虑历史库的问题,可以设计一个通用的架构来自动实现两个库的连接。    

以上是我能想到的几种方法,请各位高手指教。如果有其他的解决方法,请不吝赐教。

------解决方案--------------------
如果可以的话,分析一下哪些数据需要用到过去数据,将过去数据做为
一条记录保存在生产库里。
比如我曾遇见这样的问题:在报表里要显示前3年累计等。
这时我就将每年的累计数据保存在生产库里,与其他每天累计保持一致。
(注意:这时一定已经将前年的数据导到了历史库中,而没有残留)
可以在按一定规则转移到历史库的逻辑里写这个处理。
这样用到的就是本地数据了。
不知道与你的情况相似不相似?
------解决方案--------------------
个人觉得union all + 合适的索引比较好,有索引的话就不担心查不查大力历史表的问题了,就算在历史表里没有,因为用了索引,也会很快。