白老师就是那么牛,再转。
最近有网友问我SQL的执行有哪些步骤。实际上SQL执行是一个十分复杂的事情。这里仅介绍SQL提交到SQL引擎后的几个重要的阶段。一个SQL的执行分为分析(PARSE),执行(EXECUTE)和FETCH三个大的阶段。
SQL执行的第一步是对语法进行分析,首先根据SQL语句,计算出SQL的HASHVALUE,然后根据HASHVALUE查找LIBRARY CACHE,是否存在这个SQL,如果存在,那么说明语法是经过检查的,不需要进行语法检查。如果不存在,那么要在LIBRARY CACHE中分配内存,这时候会涉及到SHARED POOL,LIBRARY CACHE闩锁。
第二步是进行语意的检查和SQL Transformation,对于子查询、视图等,需要通过这个阶段,转化为JOIN等
第三步是生成执行树,如果是RBO直接根据规则生成,如果是CBO,则根据优化规则,统计数据等,进行独立对象访问成本计算、连接顺序成本计算等,最终生成执行树(这部分可以通过10053事件获得详细的信息)
到此,PARSE阶段就完成了,下面进行EXECUTE阶段
EXECUTE阶段对绑定变量分配空间,然后绑定数值。并且驱动执行分析阶段生成的执行计划。在这个阶段并没有对DATA BLOCK进行访问,真正对DATA BLOCK的访问要在下一个阶段进行。
FETCH阶段会访问DATA BLOCK,并且返回需要的行。
在实际SQL的执行中,这三个阶段是相融合的,并且有些步骤可能前置或者后置。比如对于绑定变量的值如果对于执行计划生成有影响,那么变量绑定会前置到分析阶段。
如果要深入研究SQL的执行,可以通过以下一些事件来获得详细的信息:
ROW SOURCE相关:
PREDICATE相关:
CBO相关:
SQL TRACE:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9533994/viewspace-1007887/ ,如需转载,请注明出处,否则将追究法律责任。