如题,数据库是用Oracle11g  release 1, 当客户端同时大量(700~1200/sec)向系统发出请求时,每个请求都会引起一个select语句执行, 在该“select”语句发生exception:out of memory. 我做过实验,如果去掉这条query语句, 测试一个星期,也没有发生exception。 该语句很简单:slect a.1, a.2 from tbA a inner join tbB  on a.id=b.id where d.sn=xxxxx。那位前辈或高人有过这方面的经验。我始终觉得这个是和oracle的某些设置有关系。而非我们系统的问题。我所能想到的目前就是:1. cache的问题, 大并发造成cache用尽。问题是,oracle在cache用完的情况下,不会移动到cache内容去harddisk么?比如建立一个tmpfile。那么harddisk最后也用尽了,就会。2. 锁问题,由于系统是多线程,多并发,可能会在执行select的同时,另外一条线程向tbA或者tbB做插入操作。而且插入操作费时很久(有一条语句写的很垃圾, 用很久才插入完), 导致大量锁操作,最终丢出异常。但是,如果这样,为什么只有这条语句会造成异常丢出呢?我坚持认为是oracle的问题,因为同样的情况在MSSQL下没有出现. 有哪位高手熟悉oracle的配置或者查错,希望能够指点一二

解决方案 »

  1.   

    你会不会是并发太多了,然后用的dedicate模式,把pga都耗光了?
      

  2.   

    1.查看消耗资源最多的SQL:SELECT hash_value, executions, buffer_gets, disk_reads, parse_callsFROM V$SQLAREAWHERE buffer_gets > 10000000OR disk_reads > 1000000ORDERBY buffer_gets + 100 * disk_reads DESC;2.查看某条SQL语句的资源消耗:SELECT hash_value, buffer_gets, disk_reads, executions, parse_callsFROM V$SQLAREAWHERE hash_Value = 228801498AND address = hextoraw('CBD8E4B0');或者用EM监视下运行的资源使用情况
      

  3.   

    不知道能不能起作用哈可以用 prepareSQL来免除编译阶段的消耗。
      

  4.   

    select * from v$parameter where name like ‘%pga%';
      

  5.   

    目前看到的是db server确实用dedicated模式。如何去判断pga是否超出大小了呢
    system parameter当中我看到的关于pga的选项只有3个:
    pre_pga_sga, max_commit_propagation_delay, olap_page_pool_size,另外我用的连接是SQL *Net
      

  6.   


    ORDERBY buffer_gets + 100 * disk_reads DESC; 这句话可以么?貌似会出错 我delete sort 语句后发现符合这个条件的,还真没有
      

  7.   


    谢谢哈,我Orcle目前很菜。LOL
    我看了一些pga的文章发现可以设置自动管理pga,当预设的pga大小不够用的时候,会自动去扩展pga,我查我的数据库记录,确实有很多增长pga的记录,现在的问题是,是否有选项设定最大可扩展pga?另外,em是什么,我只用过sql developer,直接查v$, 想用sql plus结果总是有个tns protocol eorror,太忙了,看了2下没解决就暂时放着了。
      

  8.   

    另外, 假如说pga耗尽,那么首先尝试增加pga,这时2种情况,
    1. 物理内存不够了,vm也用光了,那么会"out of memory",但是发生out of memory的时候我去看db server 的事件查看器,没有看到类似的报告,oracle自身那里可以看到这样类似log, 我之前听说可以看tracefile。 2. 物理内存还有,不过pga的extension有上限,达到上限,分配失败。 同问,那里可以看到这个事件的记录?