Soft parse and Hard parse(Oracle 软解析和硬解析)

SQL语句执行的几个步骤:
1.parsing 解析
2.optimization 优化
3.row source generation 产生行源
4.execution 执行[@more@]

SQL语句执行的几个步骤:
1.parsing 解析
2.optimization 优化
3.row source generation 产生行源
4.execution 执行
首先SQL语句必须被解析并且被放到library cache。SQL解析包括一下步骤:
1.语法检查,检查sql语句的语法正确性,比如from不能是form等。
2.语义检查,包括引用object的有效性,验证用户权限等。
3.共享池检查,对于每一条sql语句数据库用hash算法产生已个hash value,也就是v$sql中sql_id.当用户提交一条sql语句,数据库会在共享池的shared sql area(包含解析树和执行计划)查看是否存在相同的hash value的sql语句。
soft parse:在步骤3中如果发现相同的hash value的sql语句,则说明相同的语句被执行过,那么就是软解析。
hard parse:在步骤3中没有发现相同hash value的sql语句,则要发生1,2,3三个步骤,就是硬解析。

硬解析的时候要收集很多内部的表,比如col$(列信息),obj$(对象信息),seg$(段信息),还有tab$(查看表信息),所以耗费很多的资源。
这就是在OLTP系统中推荐绑定变量而不是使用字面值的缘故。
看个小实验:
SQL> select empno,ename from scott.emp where job='SALESMAN';

EMPNO ENAME
----- ----------
7499 ALLEN
7521 WARD
7654 MARTIN
7844 TURNER

SQL> SELECT EMPNO,ENAME FROM SCOTT.EMP WHERE JOB='SALESMAN';

EMPNO ENAME
----- ----------
7499 ALLEN
7521 WARD
7654 MARTIN
7844 TURNER
SQL> select sql_text, sql_id, child_number, hash_value, address, executions
2 from v$sql where upper(sql_text) like '%SALESMAN%';

SQL_TEXT SQL_ID CHILD_NUMBER HASH_VALUE ADDRESS EXECUTIONS
--------------------------------------------------------- ------------- ------------ ---------- -------- ----------
SELECT EMPNO,ENAME FROM SCOTT.EMP WHERE JOB='SALESMAN' 2214d139kuvtg 0 3542970159 C045BA80 1
select empno,ename from scott.emp where job='SALESMAN' 36d7wt7tp3xqv 0 4082235099 C045F894 1


SQL> alter system flush shared_pool;
SQL> variable v_dept number
SQL> exec :v_dept :=10

PL/SQL procedure successfully completed

SQL> select*from scott.dept where deptno=:v_dept;

DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK

SQL> exec :v_dept :=20

PL/SQL procedure successfully completed

SQL> select*from scott.dept where deptno=:v_dept;

DEPTNO DNAME LOC
------ -------------- -------------
20 RESEARCH DALLAS
SQL> select sql_text, sql_id, child_number, hash_value, address, executions
2 from v$sql where sql_text like '%v_dept%';

SQL_TEXT SQL_ID CHILD_NUMBER HASH_VALUE ADDRESS EXECUTIONS
--------------------------------------------- ------------- ------------ ---------- -------- ----------
select*from scott.dept where deptno=:v_dept 3r7nq0n0f6s7w 0 14901500 C0518924 2

使用了绑定变量后sql被重用,避免了硬解析。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25586587/viewspace-1052989/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25586587/viewspace-1052989/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值