SQL语句的执行过程

  结构化查询语言SQL(Structure Query Language)是一种在关系型数据库中定义和操纵数据的标准语言,是用户与数据库之间进行交流的接口。下面以SQL语言为例,简要说明Oracle数据库是如何执行SQL语句的。

一、 基本阶段

        当用户执行SQL语句(这里主要值数据操纵语言DML)时,通过连接,先将该语句发送到oracle服务器,再由服务器进程处理该语句。服务器进程处理SQL语句的基本阶段是:解析、执行、返回结果。

    1、解析(perse)

        解析指检查SQL语句的语法和语义,生成SQL语句的执行计划,并将SQL语句和执行计划存放到SGA区的共享SQL区中。

        在解析期间服务器进程会执行如下操作:

  • 搜索SGA区的共享SQL区,检查其中是否存在相同的SQL语句及其执行计划。如果有,则直接执行该SQL语句。这样能够提高oracle的性能
  • 如果没有该SQL语句,就检查该SQL的语法。如果语法不正确,就将语法错误消息返回给客户机
  • 如果语法正确,就通过查询数据字典,检查该SQL语句的语义,以确定表名、列名是否正确。如果表名和列名不正确,就将语义错误消息返回给客户机
  • 如果语义正确,就给相应的对象加解析锁,以防止在解析期间其他用户改变这些对象的结构(或删除这些对象)
  • 检查用户是否具有访问相应对象的相应权限。如果没有相应权限,就将权限不够错误消息返回给客户机
  • 如果具有相应的权限,就由SQL语句的优化器来确定该SQL语句的最佳执行计划
  • 为该SQL语句在SGA区的共享SQL区中分配空间,将该SQL语句及其执行计划装入其中,以便执行

    2、 执行(execute)

        执行指服务器进程按照SQL语句的执行计划执行SQL语句。在此期间,服务器进程执行如下操作:

  • 确定被操纵对象的数据所在的数据块是否已经被读取到SGA区的数据高速缓存区中了。如果数据块在数据高速缓存中,则直接在其中操作
  • 如果数据块不在数据高速缓存中,则从数据文件所对应的物理存储设备中读取该数据块,并在数据高速缓存中寻找空闲数据块,将读入的数据放入
  • 对于update和delete语句,将需要修改或删除的行锁住,以便在事务结束之前相同的行不会被其他进程修改。对于select和insert语句,因为不会修改数据,所以不需要锁住行。

    3、 返回结果

        对于select语句,在执行阶段,要将查询到的结果(或被标示的行)返回给用户进程。加入查询结果需要排序,还要利用共享池的排序区,甚至临时表空间的临时段来排序。查询结果总是以列表格式显示。根据查询结果的大小不同,可以一次全部返回,也可以分多次逐步返回。对于其他DML语句,将执行是否成功等状态细心返回给用户进程。