Oracle sql 执行顺序及原理详解
文章目录
- 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 执行顺序及原理详解相关推荐
- for循环的执行顺序(案例+详解)
案例分析 #include <stdio.h> #include <srdlib.h> int main(void) { char c; for(c=getchar();get ...
- Oracle sql执行顺序
1. (*)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table) ...
- java8 stream运行原理之并行流原理详解
上一篇文章<java8 stream运行原理之顺序流原理详解>介绍了顺序流的执行原理,本文接着上一篇介绍并行流的执行原理. 一.如何创建并行流 调用parallel()方法可以创建并行流, ...
- Oracle SQL语句执行流程与顺序原理详解
以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...
- oracle select执行顺序,oracle select执行顺序的详解
oracle select执行顺序的详解 SQL Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子 ...
- sql注入的原理详解
sql注入原理详解(一) 我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到 ...
- Web网络安全漏洞分析,SQL注入原理详解
本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是 ...
- Oracle中序列(Sequence)详解
Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...
- Redis基础及原理详解
Redis基础及原理详解 前言:以下是最近学习redis的一些笔记总结,文中如有不当的地方欢迎批评指正,重在记录与学习,笔芯~~ Nosql概述 演进历史 单机mysql Memcached(缓存)+ ...
最新文章
- SAP PP C201使用ECR创建Recipe主数据
- android用于打开各种文件的intent
- cdqz2017-test10-加帕里图书馆(区间DP 简单容斥)
- 连载:阿里巴巴大数据实践—数据开发平台
- npm : 无法加载文件 D:\Program Files\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。
- java图像处理,彩色图像转灰度图的几种实现方式
- retain、strong、weak、assign区别
- 基于visual Studio2013解决面试题之1305字符串所有子集
- 我的世界java版导入地图_趣味地图之世界地形图3D精美版
- 字符串的编码格式转换
- flask +layUI+ ajax 上传图片
- delphi反编译ded加密解密之反汇编工具
- 基于Qt的UDP传输文字聊天小软件实现
- cidaemon.exe
- 格式化时间戳(时间戳转化为日期时间格式)
- Android应用接入微信开放平台
- java基于springboot+Vue+nodejs的高校运动会报名管理系统 element
- Xilinx原语使用方法
- mysql show master status为空值
- 机器学习各研究领域综述汇总!