运行一个语句的过程

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中查找对应的执行计划并执行。同时伴随的一个动作是将该SQLhash值在本会话的PGA中保存一份,这样下次执行这个SQL的时候,就直接从本地PGA中找到该SQL,从而跳过了从其他PGA中查找的步骤。

以上称为快速软分析

若其他会话PGA中也没有,则将该SQL作为一个字符串计算hash值,然后在library cache中查找该hash值(library cacheshared_pool的一部分,而shared_poolSGA的一部分)。若存在,则直接根据该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. 2sql语句被认为相同

select pin , name from people where pin = :blk1.pin;

select pin , name from people where pin = :blk1.pin;

b. 2sql语句被认为不相同

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_cursororacle提供的一张查看每个session打开过的cursor的视图。当我们执行一条SQL语句的时候,我们将会在shared pool产生一个library cache objectlibrary cache主要存放用户提交的SQL语句、以及执行计划),cursor就是其中针对于SQL语句的一种library cache object。另外我们会在PGA有一个cursor的拷贝,同时在客户端会有一个statement handle,这些都被称为cursor,在v$open_cursor里面我们可以看到当前打开的cursorPGAcached 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值