我们做的是b/s结构的软件,最近出现了这样的问题,同一查询程序时快时慢,而且相差很大,快的2秒,慢的40秒,对于里面的查询条件已经优化过了。而且还出现,添加记录速度很慢的情况,添加相同的记录数量比以前慢很多。
我初步怀疑是不是索引太多引起的,但其实也不是太多,而且以前也基本上是这样的索引,数据库表的大小不一致,有的大一点的有几百万条记录。
而且这种情况也就是2周之前开始出现的。实在不知道如何是好。老板让我去买本oracle的书来看看,但是又不知道该买什么。
现在实在是无从下手,请高手指点,随便什么,思路也好、可能的原因也好、告诉我买什么书看也好。各位高手一定帮忙,谢谢!!

解决方案 »

  1.   

    不知道你的表上有多少索引.
    以下情况不使用索引
    select * from tablename where id+0=1  
                            where user_name||''= 'smith'
                            where to_number(字段)=4
                            where user_name like '%D'
                            where user_name like 'D%'
                            where user_name like '%D%'
                            where user_name like 'D%D'
                            where to_char(字段)='k'
                            where nvl(字段,'0')='3'
                            where to_date(字段)
                            ......
    --以上排除建了函数索引的情况,如果想用索引则建立函数索引.提高执行速度:
    1.尽量少在条件中用to_number,to_date等的计算,
    2.尽量少用复杂的表达式.
    3.尽量少用where id=nvl(:id,id)
    4.字段变长时用where user_name ='name',定长时用where user_name like 'name'
    .....
    --索引对插入和更新的速度将会有一定的影响同一查询出现快慢的另一原因可能是:该语句第一次查询的时候慢,而后如果不修改该语句,系统将把分析优化后的sql停留在SGA区,下次执行相同的语句的时候,系统将不再分析优化,直接执行现有的语句,这样就会快很多.
      

  2.   

    第一,
        把你的该查询的表结构,数据量和SQL语句列出来。
    第二,
        用SQL_plus执行该SQL语句,并列出执行计划。
    第三,
        只有以上的条件都给充足,我们才可能真正知道你病在哪里!
      

  3.   

    几百万条数据对Oracle太小儿科了。我们这里都是几千万条数据。都没什么事情。还是要看表结构和执行计划!
      

  4.   

    to dinya2003(OK):你的解释我并不敢苟同,快慢并不是因为sql滞留在sga里。你想一想,难道一个简单的滞留会造成从2秒到40秒的差别吗?当然不会!我觉得应该cache的问题。也就是表的缓冲。在Oracle里是有这么个东西。它把一些表缓存到内存里,如果在这些内存里找不到数据就去硬盘里去找,为什么会有2秒和40秒的差别无非就是2秒的在内存里找到了而40秒的没找到还要去内存里去搂数据。
      当然sql滞留sga区确实可以提升速度,但是不明显。因为它提升的无非就是避免了再一次sql的验错、编译对我们来说意义通常不是那么大。
      

  5.   

    既然你用到了索引,就还要注意对索引的维护操作,在数据库空闲的时候,可以对索引进行rebuild,否则如果表中数据更迭频繁的时候,带有索引的查询变的越来越慢也是很正常的。
      

  6.   

    我觉着是否应该检查一下data buffer/shared pool参数设置问题呢?
    1、data buffer 存放数据,如果设置不好,常用的数据经常被挤出去,造成查询时访问硬盘,从而降低性能;
    2、shared pool也是这样,看看是否存在大量的硬解析呢?
    结论:
    呵呵,楼主,你去这里,研究研究statspack吧~
    Statspack专题
    http://www.eygle.com
      

  7.   

    有可能你的系统用的太长时间,你可以做以下几步。
    1、重新分析表。
    2、将chained row重新整理
    3、大表进行分区
    4、如果客户允许的话,先exp出来再imp进去就可以解决很多事。
      

  8.   

    我的回复上部分内容是我的测试和在使用过程中的经验,下面的内容是根据我的测试计划的分析.因为在涉及到两个测试有明显的性能差距的时候.,我会看执行计划,看系统的优化器如何分析语句, 但是有的时候却因为外界因素(比如Solaris操作系统的问题,或oracle中有了太多的任务在执行,)导致测试的效果不是很明显.,但是SQL驻留SGA区确实会提升一定的速度,
    具体你可以根据执行时间和执行计划来判断该语句的运行情况,有的DBA在工作中发现有很多查询要经常用.他会手动的把改查询正常驻留,以提升系统性能.(以上个人观点)