ORACLE 详细解释一条SQL查询语句的执行过程
例:select object_name from t where object_id=29
1、首先在PGA查询用户的连接信息和权限信息,如果PGA中没有,则去硬盘读取。同时生成唯一的hash值。
2、进入SGA查询是否有这个SQL的hash值,如果没有则进行语法、语义、权限方面的检查,检查完成后生成hash并保存下来,接着进行解析(比较全表扫描、索引等)生成最优的执行方案,和hash对应后存储起来。
3、该执行方案进去SGA去查找相应的数据,如果SGA中不存在,则从磁盘读取到SGA中,并返回用户。
实验:
sqlplus / as sysdba
drop table t;
create table t as select * from all_objects;
create index idx_object_id on t(object_id);
set autotrace on ——开始跟踪SQL的执行计划和执行的统计信息
set linesize 1000 ——-设置一行显示的字符数
set timing on ——-跟踪这条语句的执行完成时间
select object_name from t where object_id=29;
在不断开连接的情况下,将select执行两便,发现第二遍的执行时间比第一遍少很多
具体recursive calls(递归调用)、consistent gets(逻辑读)、physical reads(物理读)都非常少。总结分析为一下三种原因:
第一:首次执行时,该指令从磁盘获取用户连接信息和相关权限,并保存在PGA中,当再次执行是,由于SESSION没有断开重连,因此相关信息从PGA中读取,避免了物理读。
第二:首次执行结束后,SGA中保存了该SQL的hash,并保留了语法语义检查及执行计划等相关解析数据,再次执行时,由于该指令的hash和SGA中保存的相匹配,因此之前的硬解析无需在做,不仅跳过了相关语法语义的检查,也无需考虑使用哪种执行计划。
第三:首次执行,一般数据不再SGA中,需要物理读,之后在执行是直接从PGA中获取,避免了物理读。