程序员人生 网站导航

通过重新生成执行计划解决绑定变量执行计划偏差导致SQL执行时间过长

栏目:数据库应用时间:2015-01-30 08:13:04

基本要素(时间、用户、问题)

     用户11g环境下有段SQL语句在程序中履行效力非常差,但是在plsql中履行却很快,通过查看履行计划,发现使用了不同的索引致使,程序中履行的以下:


PLSQL中履行的效果以下:


可以看到差别,使用门诊费用记录_IX_登记时间索引是在plsql中的履行计划,使用门诊费用记录_UQ_NO的是程序中的履行计划,二者SQL是完全相同的,唯1却别就是前者使用了绑定变量,后者是直接带参数值履行。

问题分析

问题很明显,由于绑定变量生成的履行计划与实际有偏差,11g本来有个绑定变量窥测的功能,但是明显在这里没有用,分析极有多是统计信息出现了问题,需要重新对相干业务表进行统计信息搜集,让相应SQL重新生成履行计划。

解决步骤

重新搜集下相干业务表的统计信息,这里我们要注意,建议100%的搜集,如果采取采样搜集,可能没法准确生成直方图,一样会致使履行计划偏差,履行下面的语句:
exec dbms_stats.gather_table_stats(ownname => 'ZLHIS',tabname =>'门诊费用记录',estimate_percent => 100,method_opt =>'for all indexed columns size 254',no_invalidate => false,cascade => true,force => true,degree =>4);
这里我们加了no_invalidate => false, 该参数表示搜集完统计信息后,重新生成设计该对象的SQL语句的履行计划,履行完成后,再次查看履行计划正确,系统正常运行。

关键知识点

有绑定变量的SQL语句,如果出现履行计划偏差,建议重新搜集下相干业务表的统计信息。





------分隔线----------------------------
------分隔线----------------------------

最新技术推荐