版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SQL语句的解析有软解析 soft parse与硬解析hard parse之说SQL语句的解析有软解析 soft parse与硬解析hard parse之说:以下是 5 个步骤:1:语法是否合法 (sql 写法 )2:语义是否合法 (权限,对象是否存在 )3:检查该 sql 是否在公享池中存在-如果存在 ,直接跳过 4 和 5,运行 sql. 此时算 soft parse4:选择执行计划5:产生执行计划-如果 5 个步骤全做 ,这就叫 hard parse.提到软解析(soft parse)和硬解析(hard parse),就不能不说一下 Oracle对sql的处理过程。当你发出一条sql语句
2、交付 Oracle, 在执行和获取结果前, Oracle 对此 sql 将进行几个步骤的处 理过程:1、语法检查 (syntax check)检查此 sql 的拼写是否语法。2、语义检查 (semantic check)诸如检查 sql 语句中的访问对象是否存在及该用户是否具备 相应的权限。3、对 sql 语句进行解析 (parse) 利用内部算法对sql进行解析,生成解析树(parse tree)及执行 计划 (execution plan) 。4、执行 sql,返回结果(execute and return) 其中,软、硬解析就发生在第三个过程里。Oracle利用内部的hash算法来取得该
3、sql的hash值,然后在 library cache 里查找是否存在该 hash 值; 假设存在,则将此 sql 与 cache 中的进行比较; 假设“ 相同” ,就将利用已有的解析树与执行计 划,而省略了优化器的相关工作。这也就是软解析的过程。 诚然,如果上面的 2 个假设中任有一个不成立,那么优化器 都将进行创建解析树、生成执行计划的动作。这个过程就叫 硬解析。创建解析树、生成执行计划对于 sql 的执行来说是开销昂贵 的动作,所以,应当极力避免硬解析,尽量使用软解析。 这就是在很多项目中,倡导开发设计人员对功能相同的代码 要努力保持代码的一致性,
4、以及要在程序中多使用绑定变量 的原因。软解析、硬解析的一个小测试:软解析、硬解析的一个小测试:SQL> create global temporary table sess_event on commit preserve rows as select * from v$session_event where 1=0; Table createdSQL> insert into sess_event2 select * from v$session_event3 where sid=(select sid from v$mystat where rownum=1);
5、9 rows insertedSQL>SQL> SELECT NAME,V ALUE FROM V$MYSTATA,V$STATNAME B WHERE A.STATISTIC#=B.STATISTIC#2 AND NAME LIKE 'parse count%'3 ;NAME V ALUE parse count (total) 32127parse count (hard) 30365parse count (failures) 1 SQL>SQL> begin2 for i in 1.10000 loop3 exec
6、ute immediate 'insert into test values('|i|','|i|')'4 end loop;5 commit;6 end;7 /PL/SQL procedure successfully completed SQL>SQL> SELECT NAME,V ALUE FROM V$MYSTATA,V$STATNAME B WHERE A.STATISTIC#=B.STATISTIC#2 AND NAME LIKE 'parse count%'NAME V ALUE pars
7、e count (total) 42201parse count (hard) 40379parse count (failures) 1 没有使用绑定变量 (这种写法往往有人 误认为使用了绑定 ,这里就不多解释了 )总解析次数: 10074 硬解析次数: 10014上边 2个值除了我们的循环 10000 次外,还包括其他一些系 统表的读写,所以解析次数大于10000,但是我们要注意下面的结果,对于每个 SQL都有一个版本,也就是 ORACLE 对于每个不同的 SQL 分别 执行了硬解析, 下面是共享池最后缓存的数据 (部分已经被覆 盖 )SQL> selectSQL_TEXT,
8、VERSION_COUNT,PARSE_CALLS,EXECUTIONS from v$sqlarea where upper(sql_text) like '%TEST%'SQL_TEXT VERSION_COUNT PARSE_CALLS EXECUTIONS insert into test values(9630,9630) 1 1 1insert into test values(9950,9950) 1 1 1 insert into test values(9625,9625) 1 1 1insert into test values(9592,9592) 1 1
9、 1insert into test values(9940,9940) 1 1 1insert into test values(9897,9897) 1 1 1中间内容略 SQL_TEXT VERSION_COUNT PARSE_CALLS EXECUTIONS insert into test values(9838,9838) 1 1 1insert into test values(9716,9716) 1 1 1insert into test values(9691,9691) 1 1 1insert into test values(9831,9831) 1 1 1insert
10、 into test values(9992,9992) 1 1 1insert into test values(9883,9883) 1 1 1insert into test values(9865,9865) 1 1 1435 rows selectedSQL> truncate talbe sess_event;truncate talbe sess_eventORA-03290: 无效的截断命令 - 缺失 CLUSTER 或 TABLE 关键字 SQL> truncate table sess_event;Table truncatedSQL&g
11、t; alter system flush shared_pool;System alteredSQL>SQL> insert into sess_event2 select * from v$session_event3 where sid=(select sid from v$mystat where rownum=1);10 rows insertedSQL>SQL> SELECT NAME,V ALUE FROM V$MYSTAT A,V$STATNAME B WHERE A.STATISTIC#=B.STATISTIC# 2 A
12、ND NAME LIKE 'parse count%'NAME V ALUE parse count (total) 42643parse count (hard) 40456parse count (failures) 2SQL>SQL> begin2 for i in 1.10000 loop3 execute immediate 'insert into test values(:v1,:v2)' using i,i;4 end loop;5 commit;6 end;7 /PL/SQL procedure successful
13、ly completedSQL> SQL> SELECT NAME,V ALUE FROM V$MYSTAT A,V$STATNAME B WHERE A.STATISTIC#=B.STATISTIC#2 AND NAME LIKE 'parse count%'NAME V ALUE parse count (total) 42688 parse count (hard) 40466 parse count (failures) 2 下面看下使用绑定变量的情况 (真正使 用了绑定 ) 总解析次数: 45硬解析次数: 10我们可以看出差异是多么大了,
14、呵呵, 对于 SQL 本身只有一 次软解析,执行次数为 10000SQL> select SQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper(sql_text) like '%TEST%'SQL_TEXT VERSION_COUNT PARSE_CALLS EXECUTIONS begin for i in 1.10000 loop execute immediate 'insert into test values(:v1,:v2 1 1 1update sy
15、s.job$ set failures=0, this_date=null, flag=:1, last_date=:2, next_dat 1 1 1insert into test values(:v1,:v2) 1 1 10000selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIONS from v$sqlarea where upper( 1 1 1selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIONS from v$sqlarea where upper( 1 1 1SQL>
16、alter system flush shared_pool;System altered 但是我们要注意一个情况,即时同样的 SQL 如果没有使用绑定变量, ORACLE 也会对其执行一次软解析 的,但是没有硬解析,如下:每执行一次 SQL ,也会同时产生其他写系统表等很多相关的 软解析包括查询 SQL 本身。硬解析不变。SQL> insert into test values('1','1111111111');1 row insertedSQL> commit;Commit completeSQL> select
17、SQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper(sql_text) like '%TEST%'SQL_TEXT VERSION_COUNT PARSE_CALLS EXECUTIONS update sys.job$ set failures=0, this_date=null, flag=:1, last_date=:2, next_dat 1 1 1insert into test values('1','1111111111') 1 1 1s
18、elect SQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper( 1 1 1 select SQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper( 1 1 1SQL> insert into test values('1','1111111111');1 row insertedSQL> commit;Commit completeSQL&
19、gt; selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper(sql_text) like '%TEST%'SQL_TEXT VERSION_COUNT PARSE_CALLS EXECUTIONS update sys.job$ set failures=0, this_date=null, flag=:1, last_date=:2, next_dat 1 1 1insert into test values('1','1111111111
20、9;) 1 2 2 selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper( 1 1 1 selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper( 1 2 2SQL> SQL> SELECT NAME,V ALUE FROM V$MYSTAT A,V$STATNAME B WHERE A.STATISTIC#=B.STATISTIC# 2 AND NAME LI
21、KE 'parse count%'NAME V ALUEparse count (total) 42906parse count (hard) 40520parse count (failures) 2SQL> insert into test values('1','1111111111');1 row insertedSQL> commit;Commit completeSQL> selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIONS from v$sq
22、larea where upper(sql_text) like '%TEST%'SQL_TEXT VERSION_COUNT PARSE_CALLS EXECUTIONSbegin dbsnmp.mgmt_response.get_latest_curs(:a); end; 1 1 1 /*/* OracleOEM */ BEGIN IF (:1 = 'READ WRITE') THEN - For a read- 1 1 1/*/* OracleOEM */ DECLARE instance_number NUMBER; latest_task_id NUM
23、BER; 1 1 1 update sys.job$ set failures=0, this_date=null, flag=:1, last_date=:2, next_dat 1 4 4 insert into test values('1','1111111111') 1 3 3 DELETE FROM MGMT_DB_LATEST_HDM_FINDINGS WHERE TARGET_GUID = :B2 AND COLLECTION_T 2 3 3selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS
24、from v$sqlarea where upper( 1 1 1 selectSQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper( 1 3 38 rows selectedSQL> SQL> SELECT NAME,V ALUE FROM V$MYSTAT A,V$STATNAME B WHERE A.STATISTIC#=B.STATISTIC# 2 AND NAME LIKE 'parse count%'NAME V ALUE parse count
25、 (total) 42922parse count (hard) 40520parse count (failures) 2SQL> insert into test values('1','1111111111');1 row insertedSQL> commit;Commit completeSQL> insert into test values('1','1111111111');1 row insertedSQL> commit;Commit completeSQL> select SQL_TEXT,VERSION_COUNT,PARSE_CALLS,EXECUTIO NS from v$sqlarea where upper(sql_text) like '%TEST%'SQL_TEXT VERSION_COUNT PARSE_CALLSEXECUTIONSbegin dbsnmp.mgmt_response.get_latest_curs(:a); end; 1 1 1 /*/* OracleOEM */ BEGIN IF (:1 = 'READ WRITE'
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土地租赁协议2023
- 部编版六年级语文上册第八单元知识梳理填空
- (2024)1-4酸钠盐生产建设项目可行性研究报告(一)
- 2023年天津市益中学校高考语文模拟试卷
- 2023年家政服务项目融资计划书
- 零食行业蓝皮书
- 电力电缆模拟习题+参考答案
- 养老院老人生活设施维修人员管理制度
- 养老院老人访客管理制度
- 2024年旅游产品销售与推广合同3篇
- 2024年社区警务规范考试题库
- 2024年7月国家开放大学法学本科《知识产权法》期末考试试题及答案
- 2022年全国应急普法知识竞赛试题库大全-中(多选题库-共2部分-1)
- 神经病学运动系统
- 妊娠合并甲减的护理
- (新版)船舶管理(二三副)考试题库及答案【正式版】
- 《危机公关处理技巧》课件
- 科学活动会跳舞的盐
- 第六单元除法 (单元测试)-2024-2025学年四年级上册数学 北师大版
- 幼儿园手足口病教师培训
- 浦东机场使用手册考试V7-R2
评论
0/150
提交评论