10.12.07

又一次郁闷的SQL问题

Posted in Oracle管理 at 3:26 pm by David.Guo

昨天晚上,应用上线,23点开始干活,前期都十分正常,大概在凌晨3点左右,应用有故障过来.一个sql从应用中执行,运行很慢很慢.

检查那个sql,其实是很简单的一个sql,就是在一个表中(约4kw记录),根据where后的三个条件作一个查询,没有表关联.

在plsql中查看该sql的执行计划,在plsql中,该sql的执行计划正常,cost为6,走的是正确的索引.

检查索引的状况,没有任何不对的地方,而且在10号表以及索引都被分析过.并且该表数据不会出现任何异动,也就是说,数据量没有大的增,删,改.

在sqlplus中explain该sql的执行计划,也正常.

让应用发起该应用,在后台捕获该sql的hash_value,然后根据hash_value到v$sql_plan中去查询sql的真实执行计划.还是正常,因为该执行计划非常之简单,就是走了个索引,cost为6.

如果将该sql中的绑定变量直接写上常量,在plsql或者sqlplus中执行,速度非常好,但是在应用上,就是很慢,应用的后台log看,就是慢在这个select上.

那么,实在没有办法,用dbms_system.set_sql_trace_in_session跟踪该sql到底在作什么,奇怪的问题,就出现了,只要我打开trace,sql执行就很快,trace文件中,没有什么异常,只要我关闭trace,sql立刻执行缓慢.

并且,我有两个一模一样的环境,一个在aix 5.3上,一个在hpux11.11上.两个机器上的表现完全相同.

实在没有办法了,将表重新分析一次,取样5%.aix上的正常了,hp上的不正常,还是慢,并且在等待全表扫描和读取临时表空间.在分析一次hp上的该表.系统正常.

实在想不明白为什么会这样,没道理的事情呀.

谁见过这种情况,还是我被oracle忽悠了下.

 

5 Comments »

  1. wangyihbu said,

    October 12, 2007 at 5:28 pm

    是不是应用系统的问题?

    我遇到过一次一个简单的查询很慢,而且cpu负荷很高,看sql的执行计划都正常,
    后来发现是应用系统的一个配置文件有问题.

  2. d.c.b.a said,

    October 12, 2007 at 8:21 pm

    cost只是一个假的值,
    你要看真正的执行代价, consistent gets是多少?

  3. Thomas Zhang said,

    October 12, 2007 at 9:34 pm

    4千W的表,如果索引的选择性很低的话,性能差了是可想知的了.另外看看你分析的比例太小了,执行计划变化也是很有可能的.

    是否采用了bind var(peeking也会导致问题,所以我这里干脆关闭了)

    另外clustering_factor因子很重要,索引和表中记录的顺序一致对性能有很大提高(你可以找时候做个sort)

  4. victor666666 said,

    October 19, 2007 at 8:32 am

    这个sql语句cost应该是真值。

  5. victor666666 said,

    October 19, 2007 at 8:33 am

Leave a Comment