Oracle SQL语句解析过程
目录
1 软硬解析
SQL语句在到达Oracle实例后,需要先进行解析,分析出最优的执行计划后,再按照执行计划,开始执行SQL。根据能否复用执行计划,解析过程可以分析以下两大类:
- 硬解析过程:当一用户第一次提交一条SQL语句时,Oracle会将这SQL进行Hard parse,过程有点像程序编译,会检查SQL语法、表及其他对象的权限等信息。这过程会花比较长的时间,因为它要分析SQL语句的语法与语义。然后获得最优化后的执行计划(sql plan),并在内存中分配一定的空间保存该语句以及对应的执行计划等信息。
- 软解析过程:当用户第二次请求或更多次请求时,Oracle会自动找到先前的语句与执行计划,不会进行Hard parse,而是直接进行Soft parse,即把语句对应的执行计划调出,然后执行,从而减少数据库的分析时间。
【注意】:Oracle中只有完全相同的语句,包大小写、空格、换行都要求一样时,才会重复使用以前的分析结果与执行计划。
对于大量的、频繁访问的SQL语句,尽量采用Bind变量方式,走Soft parse,减少Hard parse,降低CPU和内存资源消耗。
2 SQL解析过程
ORACLE SQL语句的具体处理过程,大致如下:
- SQL语句经过HASH运算,得到一个HASH值;
- 在Shared Pool 的 Library Cache 中查找是否有相同的HASH值,如果存在,则无需硬解析,直接进行软解析;
- 如果Shared Pool不存在此HASH值,则进行语法检查,查看是否有语法错误 ;
- 如果没有语法错误,就进行语义检查,检查该SQL引用的对象是否存在,该用户是否具有访问该对象的权限;
- 如果没有语义错误,对该SQL进行解析,生成解析树和执行计划;
- 生成ORACLE能运行的二进制代码,运行该代码,并返回结果给用户 ;
图1 - Oracle SQL解析过程:
下面是eygle《深入解析ORACLE》中关于SQL执行过程的描述:
- 首先获得library cache latch,根据SQL的HASH_VALUE在library cache中查找是否存在此HASH_VALUE,如果找到这个HASH_VALUE,称之为软解析,Server获得改SQL执行计划转向第4步,如果找不到共享代码就进行硬解析。
- 释放library pool cache,获得shared pool latch,查找并锁定自由空间(在bucket 中查找chunk)。如果找不到,报ORA-04031错误
- 释放shared pool latch,重新获得library cache latch,将SQL执行计划放入library cache中。
- 释放library cache latch,保持null模式的library cache pin/lock.
- 开始执行。