一条SQL的执行过程:
1.建立连接:
***客户端要访问数据库,则oracle会在客户端和服务器进程之间建立一个会话,并在服务器上建议一个专门处理这个会话的进程,即服务器进程。客户端键入sql命令,通过连接将sql命令传输到服务端(连接的作用就是传递,不做分析)。
2.语法检查
:服务端接受sql命令到共享池,并在共享池的共享sql区域检查此sql的语法,若有错误,则返回错误代码及错误描述(SP2-0734: unknown command beginning “selec * fr…” - rest of line ignored.),至此,并不对sql命令进行解析。
3.分析结果:
若sql语法没有错误,则对sql语句进行分析,from…where…group by…,若没有要查询的表,则返回错误代码及错误描述(ORA-00942: table or view does not exist),若语义正确,但没有匹配到查询结果,不会报错。(ORACLE只检查语法,不检查语义)并产生分析结果,即在哪张表执行什么操作。若语法和语义正确,则对所查询或修改的表加行锁及表锁,以防其他事务修改数据或删除表。
4.权限确认:
确认用户有没有访问sql语句中表的权限,语法正确,语义正确,若没有访问表的权限,依然会返回错误。
5.执行计划:
上述操作都完成且正确之后,同样是在共享sql区域,产生对该sql语句的多个执行计划,oracle会选择最优的执行计划去执行(执行计划最消耗IO),并将sql语句和执行计划存储到库高速缓存中,以便二次访问是直接执行执行计划。
6.查询或者修改:
(1)服务器进程根据执行计划去查找数据,首先要访问的地方时数据库缓冲区高速缓存,若能查询到数据,则直接返回给客户端;若查找不到,则去数据文件中查找,并将查询到的数据放在高速缓存中。返回查询结果给用户。
(2)修改也是同样的,服务器进程先访问高速缓存查找数据,若要修改数据,会先将修改的详细信息记录到redo log buffer中,再修改高速缓存。并将执行结果返回给用户。