oracle存储过程,使用变量时会执行的特别慢
语句为
insert into kwdl
select ... from klt
inner join mwl
on klt.loan_no = mwl.loan_no
and klt.datadate between to_date('2018-07-20','yyyy-mm-dd') and to_date('2018-07-20','yyyy-mm-dd')
and mwl.weightingend = to_date('2999,12,31','yyyy-mm-dd')
where klt.calc_flag = 'y'
and klt.separateness = 'n'
order by klt.loan_no,mwl.weighting_index
其中klt表大概有140W行数据,calc_flag,separateness,datadate均有索引
当单独执行这段语句时,1秒钟就能跑完,插入11138行。
但是如果将上述加粗字段在存储过程中用变量代入,就需要跑5-7分钟。(前后输出时间计算得出)
查看存储计划,当写死时KLT将会走索引,cardinality为3332
但是如果用变量则为full,cardinality为625232
请问这是什么原因?应该如何解决?
insert into kwdl
select ... from klt
inner join mwl
on klt.loan_no = mwl.loan_no
and klt.datadate between to_date('2018-07-20','yyyy-mm-dd') and to_date('2018-07-20','yyyy-mm-dd')
and mwl.weightingend = to_date('2999,12,31','yyyy-mm-dd')
where klt.calc_flag = 'y'
and klt.separateness = 'n'
order by klt.loan_no,mwl.weighting_index
其中klt表大概有140W行数据,calc_flag,separateness,datadate均有索引
当单独执行这段语句时,1秒钟就能跑完,插入11138行。
但是如果将上述加粗字段在存储过程中用变量代入,就需要跑5-7分钟。(前后输出时间计算得出)
查看存储计划,当写死时KLT将会走索引,cardinality为3332
但是如果用变量则为full,cardinality为625232
请问这是什么原因?应该如何解决?
...全文
相关推荐
oracle存储过程超详细使用手册
存储过程中,可以使用`FOR`循环或`WHILE`循环来重复执行某段代码。
存储过程的构建与执行:Oracle SQL Developer实践
本文详细介绍了在Oracle SQL Developer中构建和测试存储过程的完整流程。从输入代码到声明参数,再到编译和运行存储过程,以及如何处理数据更新和删除操作,作者逐步深入探讨了存储过程的细节和工作机制。
Oracle定时执行存储过程
四、结论在 oracle 中,定时执行存储过程可以使用 DBMS_JOB 包来实现。通过创建任务,我们可以让 oracle 自动执行某些操作,而不需要人工干预。
Oracle执行存储过程权限不足
Oracle的安全模型是基于权限和角色的。默认情况下,当一个用户执行存储过程时,他们只能使用自己的直接权限,而不是通过角色赋予的权限。
Oracle存储过程及调用
在实际应用中,存储过程广泛应用于数据处理、业务逻辑实现以及与其他系统交互等场景。了解并熟练掌握存储过程的创建、调用以及参数使用,对于Oracle数据库开发者来说至关重要。


