在同一个数据库中,用户A下有十多张表的数据来源于用户B下的对象(基表和视图),为了保证用户A跟用户B的数据一致性,用户B授这些表的select权限给用户A,系统每天在凌晨都需作同步,先将用户A下的这些表delete All,然后从用户B同步符合要求的数据到这些表中。系统是7*24的生产系统,负荷压力比较大,这些表的数据量都比较大。同步是在存储过程中完成的,由oracle的后台job在每天的凌晨调用。
目前存在的问题是:
1、用户A下的这些需同步的表碎片比较厉害,经常导致检索表时索引失效;
2、虽然同步发生在每天的凌晨,但同步时间比较长(同步过程中需作各种运算,采用的是游标来完成);
3、这些表都建有触发器,当发生DML操作时,应用会加载变动的数据到应用系统的内存中,从而导致同步时应用内存加载变动数据频繁;
4、当所有的同步完成后才commit,期间需大量的temp空间和回滚段这种同步策略肯定是有问题的,如下是我的构思:
1、不采用delete ALL,再insert ALL,改为只同步有变化的数据(期间需逐表逐条记录进行比较,如果两边完成相同则跳过,否则根据主键值进行相应的update和insert);
2、在同步的过程中创建相应的临时表;
3、采用package+procedure,分表批量commit;
还请问各位大侠,有没有更好的解决方案或优化方法,小弟将不胜感激!