在执行和获取结果前,数据库系统对此sql将进行几个步骤的处理过程:
1、解析 1)语法分析,分析SQL语句的语法是否符合规范,衡量语句中各表达式的意义会在sharepool中的data dictionary cache中 2)检查是否存在语义错误和权限。语义分析,检查语句中设计的所有数据库对象是否存在,且用户有相应的权限。会在sharepool中的data dictionary cache中
软解析:
检查共享池中是否有之前解析相同的SQL语句后所存储的SQL文本、解析树和执行计划。如果能从共享池的缓存库(
library cache
)中找到之前解析过生成的执行计划,则SQL语句则不需要再次解析,便可以直接由库缓存得到之前所产生的执行计划,从而直接跳到绑定或执行
阶段,这种解析称作软解析。
硬解析:
如果在共享池的库缓存
(
library cache
)
中找不到对应的执行计划,则必须继续解析SQL、生成执行计划,
执行的新计划存在
library cache中
,
这个过程就叫硬解析,消耗大量的CPU时间和系统资源。硬解析过多会有效降低系统性能。
2绑定变量
不使用绑定变量的SQL语句,Oracle无法将它们视为相同的,如以下两句语句:
因为自由变量的不同,Oracle认为以上是2句不同的语句,则当第一条被硬解析后,第二条SQL执行时仍无法避免硬解析。实际在以上不使用绑定变 量的情况中,只要自由变量有所改变则需要一次硬解析。这是强烈建议使用绑定变量的主要原因,使用绑定变量的语句变量的实际值仅在SQL执行的最后阶段被代 入。如以下语句:
该语句使用绑定值:x替代自由变量,在应用中语句可能以预编译或普通编译的方式存在,仅在执行阶段代入变量值,多次执行仅需要一次硬解析,较不使用绑定变量情况性能大大提升。 同时过多的硬解析还会引发共享池碎片过多的问题。因为每当需要硬解析一个SQL或者PLSQL语句时,都需要从shared pool中分配一块连续的空闲空间来存放解析结果。Oracle首先扫描shared pool查找空闲内存,如果没有发现大小正好合适的空闲chunk,就查找更大的chunk,如果找到比请求的大小更大的空闲chunk,则将它分裂,多 余部分继续放到空闲列表中。因为过多的硬解析加剧了内存段分配的需求,这样就产生了碎片问题。系统经过长时间运行后,就会产生大量小的内存碎片。当请求分 配一个较大的内存块时,尽管shared pool总空闲空间还很大,但是没有一个单独的连续空闲块能满足需要。这时,就可能产生 ORA-4031错误。
3
执行
此阶段按照执行计划执行SQL,产生执行结果。不同类型的SQL语句,执行过程也不同。 SELECT查询 检查所需的数据块是否已经在缓冲区缓存(database buffer cache)中,如果已经在缓冲区缓存(database buffer cache)中,直接读取器内容即可。这种读取方式称为逻辑读取。如果所需数据不在缓冲区缓存(database buffer cache)中,则服务器进程需要先扫描数据块,读取相应数据块到缓冲区缓存(database buffer cache),这种读取方式称为物理读。和逻辑读相比较,它更加耗费CPU和IO资源。 修改操作(INSERT、UPDATE、DELETE)
Step 1:检查所需的数据库是否已经被读取到缓冲区缓存
(database buffer cache
)
中。
如果已经存在缓冲区缓存则执行Step3
Step 2:若所需的数据库并不在缓冲区缓存
(database buffer cache
)
中,则服务器将数据块从数据文件读取到缓冲区缓存存中
(database buffer cache
)
step 3 :在缓冲区存储中修改数据行的内容,使其变成脏块,重写redo log file
step 4 :把脏块写入数据文件
4获取 提取只有SELECT查询语句才有的步骤。获取查询的记录行,必要的时候对查询结果排序。 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30166976/viewspace-1481845/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30166976/viewspace-1481845/