select AKB020,AKC190,AKC220,AAE072,AKC515,AKA135,AAC001,AKC516,AKC221,AAE040,AKC222,AKC223,AKA063,AKA065,AKC224,AKA113,AKC225,AKC226,AKC227,AKC228,AKC334,AKA068,AKC253,AKA069,AAE073,AKA064,AKA070,AKA097,AKC229,AKA071,AKA072,AKC202,AKA073,AKA076,AKC201,AKC325,AKC125,AAE100,AKC301,AKC127,AKC347,AKC384,AKC378,AKC379,AKC380,AKC381,AKC382,AKC383,AAE011,AAE036,OAE001,OAE300,OAE301,AKA609,AKC319,AKC163,AKA231,BKC228,AKA163 from kc22 where akb020 = :"SYS_B_0"and akc190 = :"SYS_B_1" and aae100 = :"SYS_B_2"
在pl/sql中秒出结果,在程序中死活通不过。
在pl/sql中秒出结果,在程序中死活通不过。
而在PL/SQL中可以使用~
where akb020 = :"SYS_B_0"and akc190 = :"SYS_B_1" and aae100 = :"SYS_B_2"
改成:where akb020 = ? and akc190 = ? and aae100 = ?
2、使用数据库服务器端的$ORACLE_HOME/rdbms/admin/awrsqrpt.sql,根据提示输入sql_id,或者该SQL真实的执行计划
如果程序一开始没问题,跑了几天有问题了,那就说明很可能是数据量的变化导致了性能的下降,如果不想获取执行计划,想碰碰运气来解决这样的问题,可以考虑最大的可能就是:SQL的执行计划走了表扫描了,你没有在三个条件上创建索引,可以试着在这三个字段上创建组合索引解决这种问题。
如果三个条件的值不断变化,但是符合条件的数据量一直能稳定在一个比较小的量级,那么SQL中硬编码INDEX提示也是个可行且不错的方案。另外我想了想,楼主你这种情况很可能是11g之后Oracle新引入的“cardinality feedback”(直译:基数反馈)功能导致的,该功能简单地讲就是Oracle会根据SQL之前执行得到的基数情况来自动更改SQL的执行计划,这个功能本意是好的,但在实际生产中,往往会捅了马蜂窝,好在,这个功能可以通过隐藏参数_optimizer_use_feedback来关闭。
如果不想加提示,其实可以通过sql profile来做类似的实现。