先有这么一个应用场景,根据条件查询单表A,语句如下:select sum(a.销售数量),sum(a.库存),a.国家,a.地市,a.年,a.时间,a.产品,....(大概10多个字段) from A a by a.国家,a.地市,a.年,a.时间,a.产品,....(大概10多个字段) order by a.产品,a.年
进入这个项目组直接丟了几个模块过来,你去优化吧.......
功能响应时间在8-12秒左右,分析下前代码发现瓶颈在数据库中,数据库中执行语句7-10左右表A数据量1000W-1500W 左右 每天凌晨会删除掉
项目采用Struts2+EJB+Ibatis+Oracle如何优化,让我如此头大!请指教~
Oracle性能优化,数据库性能优化

解决方案 »

  1.   

    根据 group by 后的字段创建索引。
      

  2.   


    组合索引?我试着创建过位图索引,但那也只是在本地验证效率,速度上确实提上到1-3,
    但是表A经常有INSERT,DELETE,UPDATE的操作,index超过10个字段你确定?
      

  3.   

    没有where条件?对全表(1000W级)进行GROUP BY和聚合?如果是这样的话,数据库级的优化效率也不会太高。对于这种统计数据的优化,ORACLE提供了最好的解决办法--物化视图。
      

  4.   

    感谢你的回答、还有个问题问下:
    表A每天凌晨会吧数据全部delete掉,每天凌晨调用一个存储过程重新集成数据,没有新增、修改、删除的用户操作,这种物化视图是创建那种方式最为合理?帮忙详细解释下、物化视图没怎么接触过,再次感谢;
      

  5.   


    表A每天凌晨会吧数据全部delete掉,每天凌晨调用一个存储过程重新集成数据,没有新增、修改、删除的用户操作,如果进行分表操作如何具体实施?这样代码改动我觉得会过大、存在一定的风险性、你觉得呢?
      

  6.   

    1000-1500W 全表的聚合,10秒的速度不错了。
    具体的帖个执行计划
    如果每天都全表删除,用truncate,不用delete
      

  7.   


    也就是说凌晨之后一天之内数据不会变。那就在它调用完存储过程之后create table *** as select *** group by ***然后直接查询这个表不就完了。物化视图也是这个原理。
      

  8.   

    感谢你的回答、还有个问题问下:
    表A每天凌晨会吧数据全部delete掉,每天凌晨调用一个存储过程重新集成数据,没有新增、修改、删除的用户操作,这种物化视图是创建那种方式最为合理?帮忙详细解释下、物化视图没怎么接触过,再次感谢;如果是这样的话,那你可以在存储过程重新生成数据之后再生成一个统计表就可以了,没必要用物化视图了。用物化视图的话,肯定要用完全刷新的方式来建,那其实和建是一个原理了。