1、运行一个语句的过程
(1) 将SQL语句经过hash算法后得到一个值hash value.
(2) 如果该值在内存中存在,那么叫命中软分析
(3) 如果该值不存在,执行硬分析
(4) 语法分析: 进行语法分析,看语法是否有错误
(5) 语义分析(权限分析): 语义分析,看权限是否符合
(6) 视图的融合: 如果有视图,将视图的定义取出
(7) 进行SQL语句的自动改写,oracle自动对SQL进行重新组合,无法人为干预. 如将子查询改写为连接
(8) 优选最佳的执行计划
(9) 变量的绑定
(10) 运行执行计划
(11) 将结果返回给客户
如果是软分析,直接执行9以后的步骤。所以从这个过程可以看出,软分析比硬分析节约了很多开销。
2、什么是快速软分析、软分析、硬分析
首先从当前会话的PGA中查找是否存在同样的SQL。如果存在,则SGA中肯定存在该SQL的执行计划,直接根据PGA中提供的hash值从SGA中查找对应的执行计划并执行。
若当前会话的PGA中不存在,则从其他会话的PGA中查找是否存在同样的SQL。如果存在,则同样根据hash值在SGA中查找对应的执行计划并执行。同时伴随的一个动作是将该SQL及hash值在本会话的PGA中保存一份,这样下次执行这个SQL的时候,就直接从本地PGA中找到该SQL,从而跳过了从其他PGA中查找的步骤。
以上称为快速软分析。
若其他会话PGA中也没有,则将该SQL作为一个字符串计算hash值,然后在library cache中查找该hash值(library cache是shared_pool的一部分,而shared_pool是SGA的一部分)。若存在,则直接根据该hash值对应的执行计划进行执行。这称为软分析。
若 library cache 中未找到该hash值。则说明该SQL是第一次执行,或者以前的执行计划已经被替换出了内存(LRU算法)。则需要进行硬分析。
3、判断SQL语句是否与共享内存中某一SQL相同的步骤
(1). 对所发出语句的文本串进行hash运算。如果得到的hash值与已在共享池中SQL语句的hash值相同,则进行第2)步:文本串比较。
(2) 将所发出语句的文本串(包括大小写、空白和注释)与在第1步中识别的所有已存在的SQL语句相比较。
例如:
SELECT * FROM emp WHERE empno = 1000;
和下列每一个都不同
SELECT * from emp WHERE empno = 1000;
SELECT * FROM EMP WHERE empno = 1000;
SELECT * FROM emp WHERE empno = 2000;
在上面的语句中列值都是直接SQL语句中的,今后我们将这类sql成为硬编码SQL或字面值SQL.
使用绑定变量的SQL语句中必须使用相同的名字的绑定变量(bind variables),例如:
a. 该2个sql语句被认为相同
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;
b. 该2个sql语句被认为不相同
select pin , name from people where pin = ?;
select pin , name from people where pin = :blk1.ov_ind;
今后我们将上面的这类语句称为绑定变量SQL。
(3). 将所发出语句中涉及的对象与第2步中识别的已存在语句所涉及对象相比较。
例如:
如用户user1与用户user2下都有EMP表,则用户user1发出的语句:SELECT * FROM EMP; 与用户user2发出的语句:SELECT * FROM EMP; 被认为是不相同的语句, 因为两个语句中引用的EMP不是指同一个表。
(4). 在SQL语句中使用的捆绑变量的捆绑类型必须一致。
4、共享池与提高SQL的命中率
--获得当前会话SID
SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;
语句"SELECT * FROM SA_ORG;"如何运行:
1)是否在PGA存在 快速软分析
--快速软分析
SELECT SQL_TEXT
FROM V$OPEN_CURSOR
WHERE SID IN (SELECT SID FROM V$SESSION WHERE USERNAME = 'EPM_LN')
AND SQL_TEXT LIKE 'SELECT * FROM SA_ORG%';
注:PGA: Program Global Area 或Process Global Area 程序全局区(官方解释) 或 进程全局区
v$open_cursor是oracle提供的一张查看每个session打开过的cursor的视图。当我们执行一条SQL语句的时候,我们将会在shared pool产生一个library cache object(library cache主要存放用户提交的SQL语句、以及执行计划),cursor就是其中针对于SQL语句的一种library cache object。另外我们会在PGA有一个cursor的拷贝,同时在客户端会有一个statement handle,这些都被称为cursor,在v$open_cursor里面我们可以看到当前打开的cursor和PGA内cached cursor。
2)share pool中有没有
--软分析
SELECT SQL_TEXT, EXECUTIONS
FROM V$SQLAREA
WHERE SQL_TEXT LIKE 'SELECT * FROM SA_ORG%';
在PGA存在属于快速软分析,share pool中有属于软分析,其他属于硬分析。
3) 硬分析
硬分析消耗大量的锁
问题:如何提高SQL的命中率
使用动态变量SQL语句
提高PGA内存空间
提高SGA SHARE POOL 内存空间
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23089035/viewspace-623705/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23089035/viewspace-623705/