一个sql优化的案例

在BI的测试过程中,同事在plsql developer中跑存储过程的时候,跑了一天没有结果,开发那边20多分钟就出结果,跟我说了后 ,帮他看了下,下面说下问题处理思路:

1是sql本身执行慢还是数据库服务器压力大,竞争太多导致了sql慢

2Plsql中的语句不断的循环调用,有很多的sql在执行,该怎么定位问题?


首先想到的是上面的2个问题,按照上面的2个问题思路去查找原因,首先看系统上的等待事件,都是空闲类的,所以应该不是系统争用导致慢的,

然后查看了下当前执行的sql,发现一个sql执行的时间有2,3分钟,查看这个sql的真实执行计划,发现小表的关联都走了hash join,感觉不对,开发的机器上跑的很快,可能是走的不同的执行计划,查看了下发现这个sql对应了2个游标,查看另一个游标对应的执行计划,发现走的是nest loop,这种的方式是正确的。


到这里找到可能引起效率差距很大的原因。接下来去查找是什么原因导致了产生了2个不同的游标,查看select * from v$sql_shared_cursor where sql_id='dzw4sta4a22av';后发现语言句柄是不同的,都是连接的同一个服务器,语言环境变量设置应该都是一样的,那么不同的就是客户端的设置了,

将同时的客户端NLS_LANGUAGE设置成与开发一致后,再次运行也只要20多分钟。


这个案例不是因为sql本身导致的,而是由于环境变量的问题导致了sql走了错误的执行计划。





你可能感兴趣的:(sql优化)