基本要素(时间、用户、问题)
用户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语句,如果出现履行计划偏差,建议重新搜集下相干业务表的统计信息。