通常来讲,数据库处理SQL都会通过三个过程:解析(parse)、执行(exec)、返回结果(fetch)ios
1.解析sql
当用户发起一个SQL语句时,Oracle经过Server Process 接收SQL语句到达oracle实例,并在Shared pool 中的 Library Cache 查找是否存在该语句对应执行计划的缓存。数据库
若是不存在则将该SQL进行硬解析(Hard parse),生成最优化的执行计划(plan),并将该执行计划等信息载入Library Cache。缓存
若是存在则不通过硬解析,而是直接进行软解析(Soft parse),从而减小数据库的分析时间。bash
2.执行oracle
server process首先在buffer cache中查找是否存在该执行计划所对应的数据块,若是存在,就直接进行DML操做(逻辑IO),不然应从数据文件中将数据块读取到buffer cache中,再进行DML操做(物理IO)。
ide
3.返回结果fetch
对于SELECT语句须要返回结果,首先看是否须要排序,若是须要则排序后返回给用户。优化
对于其余DML语句(insert/delete/update),则无需返回结果。当buffer cache中的数据块被修改时,server process将自动记录buffer的改变过程到SGA中的redo log buffer,最终分别由DBWR和LGWR进程负责将buffer cache中的脏数据块和redo log buffer中的日志写到磁盘中的data file和redo log file。spa
解析类型:硬解析、软解析、软软解析
对SQL的解析都须要频繁地访问数据字典
硬解析:
判断SQL语句是否存在语法、语义的问题
判断SQL语句所涉及的对象(表、视图)是否存在
判断执行SQL语句的用户对涉及的对象是否有权限
选择最优的执行方案,生成执行计划
其中生成执行计划最消耗系统资源(CPU、I/O、Memory),尤为是CPU和I/O资源
软解析:只判断SQL语句的语法、语义、对象权限,而不生成执行计划
软软解析:不解析
SQL> select name,value from v$sysstat where name like 'parse%' ; NAME VALUE ------------------------------ ---------- parse time cpu 1339 parse time elapsed 17374 parse count (total) 23639 parse count (hard) 3060 parse count (failures) 149 parse count (describe) 9
命中率:
命中率在Oracle数据库的多个地方都会被提起
例如当一个进程须要访问数据时,首先肯定数据是否存在Buffer Cache中,若是存在(称为高速缓存命中),则直接读取数据(逻辑IO/内存读);若是不存在(称为高速缓存未命中),则须要在Buffer Cache中寻找足够的空间将磁盘上须要的数据块复制到Buffer Cache中(物理IO/硬盘读)。
命中率=逻辑IO/(逻辑IO+物理IO)*100%
注:若是命中率低确定有问题,但命中率高不必定没问题(逻辑IO远高于物理IO,但物理IO仍旧很高的状况下)
能够经过操做系统命令vmstat、iostat查看当前系统的IO状况
[oracle@ora11g ~]$ vmstat 1 5 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 374572 25260 788168 0 0 262 34 239 253 1 4 80 16 0 2 0 0 374556 25268 788172 0 0 0 36 909 1341 0 1 99 0 0 0 0 0 374556 25268 788172 0 0 0 0 876 1248 0 1 99 0 0 0 0 0 374556 25268 788172 0 0 16 80 974 1495 0 1 99 0 0 0 0 0 374556 25276 788164 0 0 0 48 966 1428 0 1 99 0 0 [oracle@ora11g ~]$ iostat 1 5 Linux 2.6.18-308.el5 (ora11g.example.com) 07/17/2013 avg-cpu: %user %nice %system %iowait %steal %idle 1.00 0.00 3.85 15.19 0.00 79.96 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 33.72 1551.26 202.49 1052263 137352 sda1 0.10 2.58 0.01 1749 4 sda2 22.27 1256.66 141.92 852432 96271 sda3 0.07 2.37 0.00 1610 0 sda4 0.01 0.02 0.00 11 0 sda5 2.17 58.06 4.54 39382 3080 sda6 2.40 60.32 15.53 40920 10532 sda7 2.85 77.55 16.47 52605 11173 sda8 3.01 76.16 8.77 51663 5949 sda9 0.80 17.03 15.25 11554 10343 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.55 0.00 0.00 99.45 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 5.00 32.00 128.00 32 128 sda1 0.00 0.00 0.00 0 0 sda2 0.00 0.00 0.00 0 0 sda3 0.00 0.00 0.00 0 0 sda4 0.00 0.00 0.00 0 0 sda5 0.00 0.00 0.00 0 0 sda6 1.00 0.00 32.00 0 32 sda7 2.00 32.00 32.00 32 32 sda8 1.00 0.00 32.00 0 32 sda9 1.00 0.00 32.00 0 32 avg-cpu: %user %nice %system %iowait %steal %idle 0.26 0.00 0.77 0.26 0.00 98.71 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 2.00 0.00 104.00 0 104 sda1 0.00 0.00 0.00 0 0 sda2 2.00 0.00 104.00 0 104 sda3 0.00 0.00 0.00 0 0 sda4 0.00 0.00 0.00 0 0 sda5 0.00 0.00 0.00 0 0 sda6 0.00 0.00 0.00 0 0 sda7 0.00 0.00 0.00 0 0 sda8 0.00 0.00 0.00 0 0 sda9 0.00 0.00 0.00 0 0 avg-cpu: %user %nice %system %iowait %steal %idle 0.26 0.00 0.26 0.00 0.00 99.48 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 4.00 0.00 32.00 0 32 sda1 0.00 0.00 0.00 0 0 sda2 0.00 0.00 0.00 0 0 sda3 0.00 0.00 0.00 0 0 sda4 0.00 0.00 0.00 0 0 sda5 1.00 0.00 8.00 0 8 sda6 1.00 0.00 8.00 0 8 sda7 1.00 0.00 8.00 0 8 sda8 0.00 0.00 0.00 0 0 sda9 1.00 0.00 8.00 0 8 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.78 0.00 0.00 99.22 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 13.00 160.00 208.00 160 208 sda1 0.00 0.00 0.00 0 0 sda2 4.00 0.00 80.00 0 80 sda3 0.00 0.00 0.00 0 0 sda4 0.00 0.00 0.00 0 0 sda5 0.00 0.00 0.00 0 0 sda6 1.00 0.00 32.00 0 32 sda7 3.00 64.00 32.00 64 32 sda8 4.00 96.00 32.00 96 32 sda9 1.00 0.00 32.00 0 32
也能够经过v$buffer_pool_statistics视图查看命中率的状况
SQL> SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,(1-(PHYSICAL_READS/(DB_BLOCK_GETS+CONSISTENT_GETS)))*100 "Hit Ratio" FROM V$BUFFER_POOL_STATISTICS WHERE NAME='DEFAULT'; NAME PHYSICAL_READS DB_BLOCK_GETS CONSISTENT_GETS Hit Ratio -------------------- -------------- ------------- --------------- ---------- DEFAULT 12786 14986 158305 92.6216595