要了解library cache 必须先了解SQL执行过程
SQL执行过程:
一.探查执行历史
二.分析语句
三.HASH值匹配
四.生成执行计划
五.执行语句
六.排序获取返回行
一.探查执行历史
1.检查是否有打开的游标,如果有,直接通过游标连接到位于PGA的private_sql_area
2.检查初始化参数SESSION_CACHED_CURSORS是否被设置
如果设置,则同样可以通过游标指向到PGA的private_sql_area
3.检查预编译程序中HOLD_CURSOR以及RELEASE_CURSOR的设置,默认都为NO
如果设置,则同样可以通过游标指向到PGA的private_sql_area
oracle会按上面的顺序逐次检查,当发现满足条件时,就直接执行SQL(转11步),这种解析就叫快解析或软软解析
二.分析语句
如果上面的探查历史失败,就要走这步
4.创建一个游标
5.语法检查Syntax Check:
检查语法书写是否正确,是否符合SQL Reference Manual中给出的SQL语法。
6.语义分析Semantic Analysis:
查找数据字典,检查表、列是否正确,检查在对象上标记锁,如果和要放置的锁冲突则等待或报错.
锁得目的就是使得在语句的语法分析过程中不改变这些对象的定义,
验证为存取所涉及的模式对象所需的权限是否满足。
三.HASH值匹配
7.将语句转化成ASCII等效数字码,再通过HASH算法得到散列值。
8.检查库缓存中是否存在同样hash值的语句。
如果存在,要再次检查对象和权限的(若和以缓存的SQL对象权限等不匹配,会生成子游标).执行SQL(转11步),这种解析就叫软解析
四.生成执行计划
如果上面的HASH值匹配失败,就要走这步,经历这步就叫硬解析
9.由优化器(CBO)对SQL语句生成解析树,再对语句引用的表和列进行分析,得出若干种执行计划,从中选择一种最优的.
这步是最消耗资源的.
10.记录这条SQL,及其解析树,执行计划,父游标和子游标等信息记录到v$sql v$sqlarea
五.执行语句
11.执行语句从DB buffer cache中获取数据
12.若数据不在DB buffer cache中,就要先把所需数据文件中读入
如果DB bufferc cache没有空间加载 就要通过LRU算法来清理
数据是从 db_buffer_cache 获取已存在的数据 就叫逻辑读
数据若不在db_buffer_cache,从磁盘加载 就叫物理读
六.排序获取返回行 如果语句有返回行给用户才有此步骤,返回的方式是分批分量的.
13.如果语句包含order by或其他需要排序的语法(max minus等)
要在sort_area_size里排序 它存在于PGA中(只在这里排序 就是内存排序)
14.如果排序量很大 sort_area_size容不下就去临时表空间去做排序(就是磁盘排序)
15.如果排序需要返回给用户,将排好的数据放入sort_area_retained_size 它存在于UGA中
排序是批量返回的,比如100行,全部排好后,将前20就放入这个空间,被取走后
再放入20...
select EXECUTIONS,ADDRESS,HASH_VALUE,SQL_TEXT from v$sql where lower(sql_text) like 'select * from emp%';
set timing on;
在此可以测定绑定变量的优势。创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作
Oracle利用内部的hash
算法来取得该sql的hash值,然后在library cache里查找是否存在该hash值
假设“相同”,就将利用已有的解析树与执行计划,而省略了
优化器的相关工作。这也就是软解析的过程.
ORACLE在执行的时候只需要编译一次,随后执行9999次都是从共享池中共享的执行计划.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25736250/viewspace-697531/
,如需转载,请注明出处,否则将追究法律责任。