zoukankan      html  css  js  c++  java
  • SQL语句的执行过程

    在数据库管理工具端输入一条SQL语句并获得响应结果通常会经过哪些过程,这就得首先了解我们的数据库结构:

    数据库结构可分为四层

    1.存储管理层:包括存储管理、日志管理、并发控制、事务管理、缓冲区管理和封锁管理等;

    2.SQL处理层:包括SQL语法解析、重写、优化、执行、执行计划缓存与结果集缓存;

    3.接口层:比如常用的JDBC、ODBC等;

    4.工具层,比如常用的数据库对象管理工具;

    SQL的查询执行计划

    SQL的查询执行计划主要包括查询分析和查询优化

    输入SQL字符串--词法分析--语法分析--语义分析--构造查询分析树--重写查询分析树(包括视图的实现和用户自定义规则)

    记录下SQL语句在执行过程中的处理:

    在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQL语句,如果是SELECT语句,服务器进程还需要将执行结果回传给用户进程。

    首先是解析:目的是确定执行计划,找到最优的执行方案。分为软解析(已经有解析完成的缓存,解析过的SQL会有一个hash值与之相对应)和硬解析(语法分析,语义分析,权限检查,视图转换和表达式转换,决定最优的执行计划,缓存SQL文本,解析树,执行计划)

    绑定:SQL语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值

    执行:不同的操作执行过程不一样,查询操作(缓冲区缓存(可以设置),逻辑读取,物理读取),修改操作(首先确定是否在缓冲区缓存中,如果不在将数据弄到数据库缓存中,对修改的数据取得数据行锁定,取得独占锁,日志缓冲区交互,数据修改,变为脏缓冲)

    提取:只有select语句才有,获得查询的结果,必要的时候对结果进行排序。

     

    SELECT查询

    检查所需的数据块是否已经在缓冲区缓存中,如果已经在缓冲区缓存中,直接读取器内容即可。这种读取方式称为逻辑读取。如果所需数据不在缓冲区缓存中,则服务器进程需要先扫描数据块,读取相应数据块到缓冲区缓存,这种读取方式称为物理读。和逻辑读相比较,它更加耗费CPU和IO资源。

    修改操作(INSERT、UPDATE、DELETE)

    Step 1:检查所需的数据库是否已经被读取到缓冲区缓存中。如果已经存在缓冲区缓存,则执行Step 3

    Step 2:若所需的数据库并不在缓冲区缓存中,则服务器将数据块从数据文件读取到缓冲区缓存中

    Step 3:对想要修改的表取得的数据行锁定(Row Exclusive Lock),之后对所需要修改的数据行取得独占锁

    Step 4:将撤销数据的Redo记录复制到日志缓冲区,产生数据行的撤销数据,将数据行修改的Redo记录复制到日志缓冲区,修改数据行。

    Step 5: 产生数据修改的撤销数据

    Step 6:复制数据修改的Redo记录到日志缓冲区

    Step 7:修改数据行的内容,如果之前的缓冲为干净缓冲,则此时将变为脏缓冲。

    但行好事,莫问前程
  • 相关阅读:
    kubespray 容器存储设备 -- rook ceph
    RBAC 基于权限的访问控制 serviceaccount -- clusterRole clusterRoleBinding
    Kubernetes 1.10.4 镜像 版本
    rook 入门理解
    coredns CrashLoopBackOff 报错
    kubespray -- 快速部署高可用k8s集群 + 扩容节点 scale.yaml
    nginx反向代理 强制https请求 + 非root用户起80,443端口
    nginx rewrite flag
    CentOS7下双网卡iptables端口转发规则
    给php安装openssl扩展
  • 原文地址:https://www.cnblogs.com/mingfan/p/11111243.html
Copyright © 2011-2022 走看看