本节讲解shared pool的内存结构
SQL语句的执行分为三个阶段:
1. SQL的解析(parse);
2. SQL的执行(exec);
3. SQL结果的获取(fetch)。
Shared pool是一块内存池,最主要的作用是缓存SQL语句以及SQL语句的执行计划。Sharedpool主要在parse阶段起作用。
Shared pool本身分为很多部分:
1. free,shared pool的空闲空间;
2. library cache,库缓存,缓存的是SQL语句以及SQL语句对应的执行计划;
3. row cache字典缓存,oracle数据库自身的信息都存在数据字典里面,如数据库有多少表,多少用户等。管理数据库必须要知道数据库里有什么,这些都属于数据字典的信息;
查看library cache有多大:
SQL> select * from v$sgastat a wherea.NAME='library cache'; POOL NAME BYTES ------------ ------------------------------------ shared pool library cache 5538864
查看free空间有多大:
SQL> select * from v$sgastat a wherea.pool='shared pool' and a.NAME='free memory'; POOL NAME BYTES ------------ ------------------------------------ shared pool free memory 58521616
查看row cache空间有多大:
SQL> select * from v$sgastat a wherea.NAME='row cache'; POOL NAME BYTES ------------ ------------------------------------ shared pool row cache 7480368
oracle的解析分为三种,这里只讲两种:硬解析、软解析。
硬解析:
一条SQL进来以后,在sharedpool的library cache里面找有没有相同的SQL和SQL对应的执行计划,如果library cache里面没有缓存,就要进行硬解析。
硬解析过程:
1. server process判断SQL语法有没有错误;
2. server process检测SQL语句涉及的对象存不存在;
3. server process判断用户对执行的对象有没有权限;
4. 生成执行方案;
5. 一条SQL可以生成N个执行方案,需要在N个执行方案中选出最优方案作为SQL的执行计划。这是硬解析最重要也是最消耗资源的一步(70%);
软解析:
一条SQL进来以后,在sharedpool的library cache里面找到了相同的SQL和SQL对应的执行计划,然后进行软解析。
过程:
1. 软解析也对语法做检查;
2. 检查对象权限;
软解析只是进行常规检查,不会像硬解析那样从N个执行方案里选出最优方案作为执行计划。软解析没有最消耗资源的一步。
硬解析和软解析都用到了数据库很多信息:权限信息、对象信息等,这些都属于字典信息。解析对数据字典的访问很频繁,所以就把数据字典信息放到shared pool的row cache里面。让row cache和library cache协同工作。
查看oracle解析的统计信息:
SQL> select name,value from v$sysstatwhere name like 'parse%'; NAME VALUE -------------------------------------------------------------------------- parse time cpu 233 parse time elapsed 1185 parse count (total) 7595 parse count (hard) 1129 parse count (failures) 0<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
parse count(total):数据库自启动以来发生的解析次数(7595),包含软解析和硬解析;
parse count(hard):硬解析的次数(1129),软解析=total-hard;
parse count(failures):解析失败;
如果failures和hard的次数大,那么存在问题。