暂无图片
EXECUTE IMMEDIATE作用
我来答
分享
Zoe
2024-12-04
EXECUTE IMMEDIATE作用

存储过程循环,循环内部有句sql,明明可以使用简单的select into 语句,没搞明白前人怎么会使用EXECUTE IMMEDIATE写法,跑2h不完。我改写成select into语句之后2分钟之内就跑完了。疑惑前人为什么这么写以及为什么使用EXECUTE IMMEDIATE写法时间就很长。

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
漫步者

动态SQL和静态SQL的差别是有的,但是按照你说的时间从2H到几分钟,这应该是不太可能的,差距没有这么的明显;你需要考虑其它因素的影响

暂无图片 评论
暂无图片 有用 0
暂无图片
Zoe

静态SQL的执行计划会被缓存,动态SQL每次执行时都需要重新解析。尤其在频繁执行的情况下,动态SQL性能远远慢于静态SQL。

暂无图片 评论
暂无图片 有用 1
Thomas

前人是照着他的前人应付任务,依葫芦画瓢,不求甚解的;而作者你是认真琢磨功能,想把代码写好的。这就是你和前人的不同之处。

暂无图片 评论
暂无图片 有用 0
广州_老虎刘

根据你的描述, 基本能够得出的结论就是, 你的execute immediate 没有使用using , 使用的是下面的写法, 每次执行都需要硬解析, 如果循环次数多, 时间长很多是正常的:

execute immediate 'select /*+ tag1 */count(*) from t1 where object_id='||i into v_cnt;



如果你使用的是带using(绑定变量写法)的execute immediate, 在执行时间上只会比select into的写法慢一点点,比如:

execute immediate 'select /*+ tag3 */count(*) from t1 where object_id=:xxx' into v_cnt using i;  这个是使用execute immediate的标准写法.


对应的select into 写法:

 select /*+ tag2 */count(*) into v_cnt from t1 where object_id=i;


暂无图片 评论
暂无图片 有用 2
Zoe
题主
2024-12-10
谢谢老师的详细讲解,确实是老师说的这种情况。
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏