使用ORACLE11G,最初写了一个多表查询的较复杂视图,使用过程中发现查询速度不够理想,查看执行计划,发现多次进行全表扫描,遂起了优化的念头。视图较长,就不贴出来了,简单描述下,结果为T1,T2,T3,T4,T5,T6六个表联合查询,其中T4,T5,T6又是视图内子查询生成的表。
        想了个笨办法,使用http://blog.csdn.net/a9529lty/article/details/5672552中描述的方法,自定了两对get和set函数,将查询的起始时间和结束时间作为参数,希望在视图中缩小子查询SQL的范围,降低消耗,但是在调试过程中发现,执行select XXX, YYY, ZZZ FROM view(复杂查询) where packge.set_param_dateFrom('2017-05-07')='2017-05-07' and  packge.set_param_dateTo('2017-05-09')='2017-05-09'时,发现查询结果不对,使用PL/SQL进行test发现,执行sql语句时,包内的set函数根本没有执行,直接执行的是get函数,返回的是空,当然sql查不出结果。反复检查,也没查出来简单的包和函数有什么异常,于是又写了一个单表查询的视图做测试,select AAA, BBB, CCC FROM view(单表查询) where packge.set_param_dateFrom('2017-05-07')='2017-05-07' and  packge.set_param_dateTo('2017-05-09')='2017-05-09'  ,这次可正常进行参数赋值取值,进行test也发现,过程为先实例化包、进行set函数调用,进行get函数调用,视图sql执行,返回需要的行数,证明包和函数均无异常。
     郁闷之下,再返回头看看自己最初修改的包含参数的复杂存储过程,怀疑是不是子查询sql语句有问题,于是逐步注释T1到T6表,再进行测试,终于发现,只要视图中包含T5.T6两个表,就会再次出现最初的问题,否则一切正常。这点真是让人百思不得其解T1、T2、T3三个表为单表,应该不会有什么问题,后三个表的共同特点为都使用了group by,但T4是使用PIVOT的行列转换,增加T4也不出问题,就是T5、T6使用一般函数(一个MAX()结合group by,一个DECODE结合group by)的分组就不行,难道group by也会影响调用包内的函数?说了一大堆不知表达清楚没,因问题比较特殊,网上到处查资料也不明白,请各位大大帮忙解答,小弟拜谢!!