oracle 主键 hash,oracle之SQL_ID 1

在Oralce里,一个sql语句执行时会生成很多信息:SQL唯一标识

SQL文本信息

绑定变量信息

执行计划和游标信息

统计信息

性能信息

其他信息.例如sql来源,状态等

SQL_ID

在Oracle中,SQL优化器是负责解析sql的(包括直接执行的sql和存储过程中的sql),中的sql在提交sql优化器解析前,会进行一些预处理,包括大小写,空格,注释的处理等。

在解析sql时,sql优化器会分配一个ID(子游标),唯一标识一个sql(存储在v$sql视图内)。相同的sql文本sql_id是一样的(对应v$sqlarea中的数据,称它为父游标),即使是不同的数据库实例中,这个以后在介绍。其他视图通过这个id引用这个sql,在9i中对应的是hash_value这个字段,11g中v$sql有字段old_hash_value对应9i的hash_value,sql_id和hash_value是通过一定的算法计算出来的。

1.直接执行的sql:

在sql_window下执行select /*test*/* from scott.emp e where e.empno = 10;

select /*test*/* from scott.emp e where e.empno =  10;

select /*test*/* from scott.emp E where e.empno =  10;

查询他们的sql信息select * from v$sql v where v.SQL_TEXT like '%/*test*/%';

e0a50514736516163369b8e478c33e5a.png

可以看到如果两个sql文本之间只要有任何的不同,就会生成不同的sql_id

2.存储过程中的sql:

分静态sql和动态sql两种,动态sql和第一种直接执行的sql一样,我们关注一下静态sqldeclare

v number;

begin

select /*+test1*/e.sal into v from scott.emp e where e.empno = 7369;

select /*+test1*/e.sal into v from scott.emp e where e.empno =  7369;

select /*+test1*/e.sal into v from scott.emp E  where e.empno =  7369;

end;

/

执行后,查询sql信息,这里应该使用提示/*+xxx*/,注释会被过滤掉

9ecf9ec447215fee4c89886ae1a97734.png

从图中可以看出,三个sql语句只生成了一个sql_id,说明plsql提交到sql优化器的时候做了一些预处理。

如果使用绑定变量呢?我们来看看有什么变化declare

v dbms_sql.Number_Table;

xx number;

begin

v(1) := 7369;

v(1) := 7499;

v(1) := 7521;

for i in v.first .. v.last loop

select /*+test2*/e.sal into xx from scott.emp e where e.empno = v(i);

end loop;

end;

/

我们来看看sql_id情况

0c24ad4d0028e6cabbce9e11b4c363f7.png

我们看到也是只有一条sql语句的sql_id信息。e.empno = v(i) 被替换成了 绑定变量:B,当sql被提交到内存执行的时候,才会替换为具体的值并执行返回结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值