zoukankan      html  css  js  c++  java
  • 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语句,将执行是否成功等状态细心返回给用户进程。

  • 相关阅读:
    Ubuntu 上安装MySql
    Vue中组件的使用
    Swagger在 NETcore 中的使用
    awk 中 fieldwidths使用方法
    3.BIND从服务器及缓存服务器配置
    2.BIND服务基础及域主服务器配置
    1.DNS基础及域名系统架构
    Linux防火墙iptables的策略
    inode占用100%时硬盘无法写入文件故障处理
    特殊计算方式(数组)
  • 原文地址:https://www.cnblogs.com/password1/p/6000444.html
Copyright © 2011-2022 走看看