首页 / ORACLE / oracle之SQL_ID 1
oracle之SQL_ID 1
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了oracle之SQL_ID 1,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2365字,纯文字阅读大概需要4分钟。
内容图文
![oracle之SQL_ID 1](/upload/InfoBanner/zyjiaocheng/469/0fbfb23a1fcf4cd59a90731b8ba2833c.jpg)
在Oracle中,SQL优化器是负责解析sql的(包括<a>直接执行的sql和<b>存储过程中的sql),<b>中的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*/%‘;
可以看到如果两个sql文本之间只要有任何的不同,就会生成不同的sql_id
2.存储过程中的sql:
分静态sql和动态sql两种,动态sql和第一种直接执行的sql一样,我们关注一下静态sql
declare 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*/,注释会被过滤掉
从图中可以看出,三个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情况
我们看到也是只有一条sql语句的sql_id信息。e.empno = v(i) 被替换成了 绑定变量:B,当sql被提交到内存执行的时候,才会替换为具体的值并执行返回结果。
本文出自 “11768293” 博客,请务必保留此出处http://11778293.blog.51cto.com/11768293/1846244
oracle之SQL_ID 1
标签:oracle
本文系统来源:http://11778293.blog.51cto.com/11768293/1846244
内容总结
以上是互联网集市为您收集整理的oracle之SQL_ID 1全部内容,希望文章能够帮你解决oracle之SQL_ID 1所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。