项目中某模块涉及复杂的查询报表。原来用的是很复杂的存储过程写的,运行速度比较慢(目前200-300秒左右,当初做好以后一般都是30秒内),我觉得不是我sql语句原因,而是他们数据库本身的原因。但是硬要我重新想个解决方案,牺牲掉同步性,要我想方法,每天早上运行程序处理截止到昨天的数据,让用户在白天查询的是
已经生成好的截止到昨天的统计数据,希望失去了同步性而换取性能。求赐教,有些什么好的解决方案吗????数据库:oracle,其实数据量也不是很大,sql语句写的也非常好,他们用传统的存储过程---循环分析来做,要900多秒。

解决方案 »

  1.   

    一般来说,大数据量的报表应该是这样的,就是每天晚上定时作日结,结出昨天的数据
    然后再来查询,当然,这个要牺牲掉实时性。
    如果实时性再高一些,可以做小时结等。
    如果sql语句和硬件性能等已经不能挖潜的情况下,这样做也是没有办法的事
      

  2.   

    我認爲用到循環時就可以認爲SQL寫的不太好了。
      

  3.   

    1。确认你的数据量有多大。
    2。查看你的语句是否有in之类的关键字。(in关键字的效率是非常低)
    如果根据LZ所说,想每天自动运行处理数据。可用oracle的job。利用JOB自动运行存储过程。将数据处理好,放到统计数据表里面去。当白天用户查询的时候,只需要查询统计数据表就可以了。比如可以将job设置为每天凌晨1点开始运行。至于性能方面,主要在于存储过程的合理性,其次才是机器硬件的问题。不知道LZ明白了没。。
      

  4.   


    嗯,谢谢VilenZYP ,其实就是他们数据库问题! 这个模块本来是另外一名同事做的,用的是传统存储过程,循环里进行业务逻辑处理, 数据量一上去,20-30分钟内根本出不来结果,直接卡死,然后我用了一条比较复杂嵌套较多的sql语句,当时立竿见影30秒内,后来系统用啊用啊,随着数据量增加,也就1,2分钟吧,某一夜之间,这个模块突然变成变慢了好几分钟了,其他查询也有类似变慢的倾向,现在就不想这些了,他们要我想办法,我就得换方案。
      

  5.   

    建议避免使用过于复杂的SQL,少在存储过程中使用循环。
    看看物化试图是否可行。