oracle 怎么提升游标速度

我请问一下,oracle 怎么提升游标速度
最新回答
淡淡的忧伤

2024-09-16 00:54:25

游标一般都是在执行sql语句,我不知道你指的是这个sql语句比较慢,还是单纯的游标速度慢。

sql语句慢可以根据使用改写sql语句的写法,建立索引,建立分区等优化手段来解决。
单纯游标速度慢,可以考略批量执行
bulk collect这种方式提取数据
使用forall 替代for 循环也可以提升效率。

以下是我总结的plsql调优的重点,你可以参考一下:

1. 尽早退出循环
2. static的变量尽量放在循环的外层
3. 因为and 和or 只要判断左边的表达式为真即可推出 逻辑判断
所以
将容易出现true的逻辑表达式放在左边,这样可以省下处理的时间
4. if else 和case when 同上
5. 尽量使用迭代,而不是递归,因为调用存储过程或者函数,会开辟另外的内存空间
6. 通常函数都是值传递,即传参数的时候会copy参数的值到子程序中
对于数据量比较大的参数可以使用
in out nocopy 指定引用传递,可以节省大量时间

7. 可以使用关联数组,较少查找集合中元素的时间
关联数组
index by varchar2(xx) 类似于map,会省下很集合操作,以及时间。
8. 对于cpu密集型的plsql,可以使用native 本地编译的特性
alter xxx compile plsql_code_type=native ;
9. 经常使用的子程序可以使用inline函数内嵌到主程序中
pragma inline($FUNCTION_NAME,'yes') ;
重载的程序只要拥有相同的名称都会被内嵌到program unit中
plsql_optimize_level=2的时候需要声明inline使用内联
plsql_optimize_level=3的编译的时候会自动的做这部分工作。不需要自己执行inline操作。可以使用PRAGMA INLINE (p1, 'NO');禁止内联
当level=3的时候声明了inline会给予这个子程序更高的inline的优先级。

下面的语句中

(1)PRAGMA INLINE (p1, 'YES');
(2)PRAGMA INLINE (p1, 'NO');
(3)PRAGMA INLINE (p1, 'YES');
第二行会覆盖第一行以及第三行,也就是说program unit 中奖不使用内联
10. 大量数字操作的时候可以使用java存储过程
11. 使用result cache功能 缓存经过计算得到的结果
relies_on($TB_NAME)
指定当表tb_name的数据改变时,结果集缓存失效
12. 使用
update of $COLUMN_NAME on $TB_NAME
for each row
when (new.xx>1000)
可以省下需要处理时间
最好都使用after 触发器,before可能会有锁定的问题