最近遇到一个很诡异的现象: 在存储过程中写入一张表的数据,语句很简单,就是insert …… select …… where…… 在where 条件中一旦使用了过程的传入参数,执行就非常慢(无法忍受的慢) 如果将insert 语句拼成字符串,动态执行,则没有上述问题,
如果将过程中的sql语句提出,where条件中引用参数的地方给定一个具体的值,也没有上述问题。
如果将过程中的sql语句提出,where条件中引用参数的地方给定一个具体的值,也没有上述问题。
where 条件中一旦使用了过程的传入参数 这样每次Oracle都会去解析这个SQL,属于硬解析
而采用动态SQL拼接或者where条件固定,就只需解析一次
因此你说的慢,主要在于解析时间耗费较多
plsql一般会自动使用绑定变量的.倒是你用动态sql而且不用using传入变量的时候可能会导致硬解析.
例如字符串和数字的区别
解决的办法就是用优化提示指定使用索引,或者为索引列收集直方图统计信息指导优化器采用更合理的访问路径
我觉得是不是ORACLE内部进行了转换是绑定变量失效造成的。发下执行计划
问题其实是这样造成的:
由于from使用的是个按月叠加的事实表。
每月数据增量几乎一致在400W行左右,
程序中,数据加载成功后,就开始上述的insert.条件中也使用了期别。由于数据量在表中数据期数少的时候,变化的百分比比较大,所以之前执行的执行计划就不适用与
数据变化之后的查询。
解决的办法是:每次数据叠加成功后,重新更新表状态,收集表、索引信息。
让优化器重新解析sql.不使用原来的执行计划就行了。谢谢大家。