文章目录

  • 1 概述
  • 2 执行原理
  • 3 执行顺序
    • 3.1 语法顺序
    • 3.2 整体:从内到外,从下到上,从右到左

1 概述

2 执行原理

1. 第一步:'客户端' 把语句发给 '服务器端' 执行('用户进程' -> '服务器进程')(1) Oracle '客户端'(如:pl/sql Developer, sql*plus) 是不会做任何操作的,它的主要任务就是把 '客户端' 产生的 sql 语句发送给 '服务器端'(2) Oracle '服务器端' 才会对 sql 语句进行处理(3) '客户端' 的进程跟 '服务器端' 的进程是 "一一对应" 的
2. 第二步:语句解析(1) 查询 '库缓存(librart cache)',是否存在 '相同语句的执行计划',如果存在,服务器进程会 "直接执行(直接到第三步)" 这个 sql 语句('软解析'),省略后续步骤,提高查询效率如果不存在,服务器进程会从硬盘中读取 '数据文件'('硬解析'),继续后续步骤(2) '语法检查':是否合乎语法规则(3) '语义检查':字段、表等内容是否在数据库中(4) 获得 '对象解析锁':当 语法、语义都正确后,系统会对我们需要查询的对象加锁。这主要是为了保证数据的一致性('事务特性之一'),防止我们在查询过程中,其他用户对该对象的结构发生改变(5) '权限检查':该用户是否拥有权限访问这些数据(6) 确定 '最佳执行计划':Oracle 数据库对 SQL 语句自我优化
3. 第三步:语句执行对于 select:首先 '服务器进程' 要判断所需数据是否在 '库缓存(librart cache)'如果存在,则直接获取该数据而不是从 '数据库文件' 中去查询数据,同时,根据 LRU(Least Recently Used 最近最少使用)算法增加其访问次数如果不存在,则 '服务器进程' 将从 '数据库文件' 中查询相关数据,并且,将这些数据放入到 '库缓存(librart cache)' 中对于 update、insert、delete:(1) 检查 sql 是否已经读取到 '库缓存(librart cache)'如果已存在,则直接执行步骤 3(2) 如果不存在,则 '服务器进程' 将 '数据块' 从 '数据文件' 读取到 '库缓存'(3) 对想要修改的表取得数据的行锁定(Row Exclusive Lock)(4) 将数据的 Redo 记录复制到 '重做日志缓冲区 Redo Log Buffer'(5) 产生修改的 undo 数据(6) 修改 '库缓存(librart cache)'(7) 后台进程 dbwr 将修改写入 '数据文件'

4. 第四步:提取数据

可用到的相关视图:

select * from v$session t;
select * from v$sql t;

3 执行顺序

3.1 语法顺序

sql 查询大致语法结构如下:

(5) SELECT DISTINCT <..>
(1)   FROM <..> JOIN <..> ON <..>
(2)  WHERE <..>
(3)  GROUP BY <..>
(4) HAVING <..>
(6)  ORDER BY <..>

sql 语法处理的顺序如下:

1. FROM -- 首位,sql入口
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. HAVING
7. SELECT
8. DISTINCT
9. ORDER BY

3.2 整体:从内到外,从下到上,从右到左

  • 实际开发中, sql 语句一般都挺复杂的,它们之前的执行顺序除了 上述语法顺序外 ,还有一个整体的顺序,如 标题,这点,可通过 F5(执行计划) 进行查看。

验证:从内到外(子查询优先):

验证:从下到上,从右到左:

Oracle sql 执行顺序及原理详解相关推荐

  1. for循环的执行顺序(案例+详解)

    案例分析 #include <stdio.h> #include <srdlib.h> int main(void) { char c; for(c=getchar();get ...

  2. Oracle sql执行顺序

    1. (*)选择最有效率的表名顺序(只在基于规则的优化器中有效)  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table) ...

  3. java8 stream运行原理之并行流原理详解

    上一篇文章<java8 stream运行原理之顺序流原理详解>介绍了顺序流的执行原理,本文接着上一篇介绍并行流的执行原理. 一.如何创建并行流 调用parallel()方法可以创建并行流, ...

  4. Oracle SQL语句执行流程与顺序原理详解

    以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...

  5. oracle select执行顺序,oracle select执行顺序的详解

    oracle select执行顺序的详解 SQL Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子 ...

  6. sql注入的原理详解

    sql注入原理详解(一) 我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到 ...

  7. Web网络安全漏洞分析,SQL注入原理详解

    本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是 ...

  8. Oracle中序列(Sequence)详解

    Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...

  9. Redis基础及原理详解

    Redis基础及原理详解 前言:以下是最近学习redis的一些笔记总结,文中如有不当的地方欢迎批评指正,重在记录与学习,笔芯~~ Nosql概述 演进历史 单机mysql Memcached(缓存)+ ...

最新文章

  1. SAP PP C201使用ECR创建Recipe主数据
  2. android用于打开各种文件的intent
  3. cdqz2017-test10-加帕里图书馆(区间DP 简单容斥)
  4. 连载:阿里巴巴大数据实践—数据开发平台
  5. npm : 无法加载文件 D:\Program Files\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。
  6. java图像处理,彩色图像转灰度图的几种实现方式
  7. retain、strong、weak、assign区别
  8. 基于visual Studio2013解决面试题之1305字符串所有子集
  9. 我的世界java版导入地图_趣味地图之世界地形图3D精美版
  10. 字符串的编码格式转换
  11. flask +layUI+ ajax 上传图片
  12. delphi反编译ded加密解密之反汇编工具
  13. 基于Qt的UDP传输文字聊天小软件实现
  14. cidaemon.exe
  15. 格式化时间戳(时间戳转化为日期时间格式)
  16. Android应用接入微信开放平台
  17. java基于springboot+Vue+nodejs的高校运动会报名管理系统 element
  18. Xilinx原语使用方法
  19. mysql show master status为空值
  20. 机器学习各研究领域综述汇总!

热门文章

  1. [附源码]计算机毕业设计springboot停车场管理系统
  2. linux下动态链接库使用与单步调试
  3. 计算机关闭多重网络协议,多重网络问题怎么解决?如何取消多重网络?
  4. python数组与对象
  5. Vue环境搭建及入门
  6. Redis几种常用类型的使用场景
  7. 老生常谈:中文输出出现乱码问号的问题
  8. Lotus Blossom 行动分析
  9. 10 亿个数取中位数
  10. 好好的机器人,怎么就暴走了?