Oracle 绑定变量和普通变量效率详解

1 概述

1. sql 语句执行步骤
   (1) sql 语句的执行要经过 "解析、执行、提取" 等几个阶段
   (2) 其中解析最消耗资源,解析的过程中要进行语法、语义和权限的检查
   (3) 如果这些检查都通过了,才开始执行,执行完成之后将 sql 语句的执行计划存储在共享池中 -- '硬解析'
       如果下一次有 '相同的 sql 语句要执行,则不需要解析',直接按照已经存在的执行计划执行,就可以节省资源 -- '软解析'

2. 绑定变量的作用:'生成相同的 sql 语句,减少语句解析带来的消耗'
   (1) 相同的 sql 语句:完全一样('大小写,间隔' 等等)

3. 写法:select * from stu_info t where t.sno = :b1;  

2 语法

1. 查询共享池中缓存的 sql 语句
   select * from v$sql t where t.sql_text like '%sql语句%';
   
2. 清空共享池(缓存),切勿在 生产库操作 -- 本地环境玩玩就行
   alter system flush shared_pool;

示例:

select * from stu_info t where t.sno = 1;
select * from stu_info t where t.sno = 2;

-- select * from stu_info t where t.sno = :b1;

查询结果:(2 条缓存记录)
在这里插入图片描述

3 示例

基础数据准备:

create table stu_info (
  sno   number(10),
  sname varchar2(30)
);

create table stu_info_bind as select * from stu_info where 1 = 2;

示例:insert 20W 条记录,数据越大,差异越大(update、delete 同理)

DECLARE
  v_init_date     PLS_INTEGER; -- 100 = 1秒
  v_end_date      PLS_INTEGER;
  v_end_date_bind PLS_INTEGER;
BEGIN
  v_init_date := dbms_utility.get_time;

  -- 普通 insert 测试
  FOR i IN 1 .. 200000 LOOP
    INSERT INTO stu_info (sno, sname) VALUES (i, 'a' || i);
  END LOOP;

  v_end_date := dbms_utility.get_time;

  -- 绑定变量 insert 测试
  FOR j IN 1 .. 200000 LOOP
    EXECUTE IMMEDIATE 'INSERT INTO stu_info_bind(sno, sname) VALUES(:b1, :b2)'
      USING j, 'b' || j;
  END LOOP;

  v_end_date_bind := dbms_utility.get_time;

  -- commit;

  -- 执行时间
  dbms_output.put_line('普通 insert 用时: ' ||
                       to_char(v_end_date - v_init_date));
  dbms_output.put_line('绑定变量 insert 用时: ' ||
                       to_char(v_end_date_bind - v_end_date));
END;

查询结果:

普通 insert 用时: 1049
绑定变量 insert 用时: 992
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值