第三讲--SQL语句硬解析和软解析

本节讲解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 

parse count(total):数据库自启动以来发生的解析次数(7595),包含软解析和硬解析;

parse count(hard):硬解析的次数(1129),软解析=total-hard;

parse count(failures):解析失败;

如果failures和hard的次数大,那么存在问题。

你可能感兴趣的:(Oracle体系结构)