PL/SQL Developer 查看查询的执行计划
https://zhuanlan.zhihu.com/p/65771352
通过 PL/SQL Developer 查看查询的执行计划
1 什么是执行计划
执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述。2 配置执行计划需要显示的项
2 配置执行计划需要显示的项
3 执行计划的常用列字段解释
基数(Cardinality):Oracle 估计的当前操作的返回结果集行数
字节(Bytes):执行该步骤后返回的字节数
耗费(COST)、CPU 耗费:Oracle 估计的该步骤的执行成本,用于说明 SQL 执行的
代价,理论上越小越好(该值可能与实际有出入)
时间(Time):Oracle 估计的当前操作所需的时间:
4 使用执行计划
通过工具启动执行计划。选中需要查看执行计划的查询语句,在工具栏中选择Explain Plan
或者是选择需要查看执行计划的查询语句后按 F5。
5 查看执行计划
5.1执行顺序
缩进最多的最先执行;(缩进相同时,最上面的最先执行)。
5.2表访问的几种方式(非全部):
• TABLE ACCESS FULL(全表扫描)
• TABLE ACCESS BY INDEX ROWID(通过 ROWID 的表存取)
• TABLE ACCESS BY INDEX SCAN(索引扫描)
5.2.1TABLE ACCESS FULL(全表扫描)
Oracle 会读取表中所有的行,并检查每一行是否满足 SQL 语句中的 Where 限制条件;
使用建议:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多,占到
表数据总量的 5% ~ 10% 或以上.2TABLE ACCESS BY INDEX ROWID(通过 ROWID 的
表存取)
5.2.2.1 什么是 ROWID
ROWID 是由 Oracle 自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不
会物理存储 ROWID 的值。
你可以像使用其它列一样使用它,只是不能对该列的值进行增、删、改操作。
一旦一行数据插入后,则其对应的 ROWID 在该行的生命周期内是唯一的,即使发生行
迁移,该行的 ROWID 值也不变。
5.2.2.2 TABLE ACCESS BY INDEX ROWID
行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过
ROWID 可以快速定位到目标数据上,这也是 Oracle 中存取单行数据最快的方法;
5.2.3TABLE ACCESS BY INDEX SCAN(索引扫描)
在索引块中,既存储每个索引的键值,也存储具有该键值的行的 ROWID。
5.2.3.1 索引扫描其实分为两步
1 扫描索引得到对应的 ROWID。
2 通过 ROWID 定位到具体的行读取数据。
5.2.3.2 五种索引扫描
• INDEX UNIQUE SCAN(索引唯一扫描)
• INDEX RANGE SCAN(索引范围扫描)
• INDEX FULL SCAN(索引全扫描)
• INDEX FAST FULL SCAN(索引快速扫描)
• INDEX SKIP SCAN(索引跳跃扫描)
5.2.3.2.1 INDEX UNIQUE SCAN(索引唯一扫描)
针对唯一性索引(UNIQUE INDEX)的扫描,每次至多只返回一条记录;
表中某字段存在 UNIQUE、PRIMARY KEY 约束时,Oracle 常实现唯一性扫描;
5.2.3.2.2INDEX RANGE SCAN(索引范围扫描)
使用一个索引存取多行数据;
发生索引范围扫描的三种情况:
1 在唯一索引列上使用了范围操作符(如:> < <> >= <= between);
2 在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描);
3 对非唯一索引列上进行的任何查询;通过 PL/SQL Developer 查看查询的执行计划
1 什么是执行计划
执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述。5.2.3.2.3INDEX FULL SCAN(索引全扫描)
进行全索引扫描时,查询出的数据都必须从索引中可以直接得到;
5.2.3.2.4INDEX FAST FULL SCAN(索引快速扫描)
扫描索引中的所有的数据块,与 INDEX FULL SCAN 类似,但是一个显著的区别是它
不对查询出的数据进行排序(即数据不是以排序顺序被返回);
5.2.3.2.5INDEX SKIP SCAN(索引跳跃扫描)
表有一个复合索引,且在查询时有除了前导列(索引中第一列)外的其他列作为条件;
5.2.4Oracle 的优化器
5.2.4.1 Oracle 的优化器种类
• RBO(Rule-Based Optimization) 基于规则的优化器
• CBO(Cost-Based Optimization) 基于代价的优化器
5.2.4.2 RBO 优化器
RBO 有严格的使用规则,只要按照这套规则去写 SQL 语句,无论数据表中的内容怎样,
也不会影响到你的执行计划。换句话说,RBO 对数据“不敏感”,它要求 SQL 编写人员必
须要了解各项细则。RBO 一直沿用至 ORACLE 9i,从 ORACLE 10g 开始,RBO 已经彻底
被抛弃。
5.2.4.3 CBO 优化器
CBO 是一种比 RBO 更加合理、可靠的优化器,在 ORACLE 10g 中完全取代 RBO。CBO
通过计算各种可能的执行计划的“代价”,即 COST,从中选用 COST 最低的执行方案作为实
际运行方案。
6 执行计划的使用
6.1单表
6.1.1分析查询表中的所有数据
6.1.1.1 示例
查询 employees 表中的所有数据.2分析主键作为条件的查询
6.1.2.1 示例
查询 employees 表中 employees_id 为 100 的雇员
6.1.3分析非主键列作为查询条件
6.1.3.1 示例
查询雇员名字为 Tarloy 的雇员.4分析 like 条件
6.1.4.1 示例
查询雇员名字中含有 a 的雇员
6.1.5分析非唯一性索引列作为条件的查询
6.1.5.1 示例一
将 last_name 创建索引
create index emp_name on
employees(last_name);
6.1.5.2 示例二
查询雇员名字为 Taylor 的雇员。
6.1.6分析非唯一性索引中=、>、< 、<>条件
6.1.6.1 示例一
对雇员薪水列做=、>、<、<>条件判断。
6.1.6.2 示例二
对薪水创建索引,使用薪水列做=、>、<、<>条件判断。
6.2多表
6.2.1内连接
6.2.1.1 示例一
使用等值连接,查询所有部门以及所有部门下的雇员。
6.2.1.2 示例二
使用子查询,查询所有部门以及所有部门下的雇员。
6.2.2外连接
6.2.2.1 示例一
查询所有雇员与雇员的部门名称,包含那些没有部门的雇员。
PL/SQL Developer 查看查询的执行计划的更多相关文章
- 如何使用PL/SQL Developer查看和杀掉session
http://jingyan.baidu.com/article/3ea51489eb65b152e61bba8b.html
- Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法
PL SQL Developer,查询结果中的中文变成了一堆问号,SQL语句中的中文被提示invalid character,不能识别. 解决方法: 执行,select userenv('langua ...
- PL/SQL DEVELOPER执行计划的查看
这里,我学到的一个很重要的东西,就是用PL/SQL DEVELOPER去看一条SELECT语句的执行计划,执行计划里面可以看到这条SELECT语句的开销.I/O操作开销等数值,可以很清晰地看到语句各个 ...
- PL/SQL Developer 使用中文条件查询时无数据的解决方法
PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:select userenv('language') from dual; 显示:SIM ...
- 如何查看正在执行sql的语句及其父语句调用?如何查看正在执行SQL的具体参数值与执行计划?
---SQL Server查询正在执行的SQL语句及执行计划 select ds.session_id,dr.start_time,db_name(dr.database_id),dr.blockin ...
- PL/SQL Developer 使用中文条件查询时无数据的解决方法(转)
原文地址: PL/SQL Developer 使用中文条件查询时无数据的解决方法 PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:sel ...
- mysql,存储引擎,事务,锁,慢查询,执行计划分析,sql优化
基础篇:MySql架构与存储引擎 逻辑架构图: 连接层: mysql启动后(可以把mysql类比为一个后台的服务器),等待客户端请求,当请求到来后,mysql建立一个一个线程处理(线程池则分配一个空线 ...
- SQL Server如何查看存储过程的执行计划
有时候,我们需要查看存储过程的执行计划,那么我们有什么方式获取存储过程的历史执行计划或当前的执行计划呢? 下面总结一下获取存储过程的执行计划的方法. 1:我们可以通过下面脚本查看存储过程的执行计划,但 ...
- SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划
我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...
随机推荐
- display的inline-block替代float的一些场景
一.横向菜单 inline-block是不换行的块级元素,对于使用ul-li结构的网页顶部横向导航菜单非常有用. 如果不使用inline-block属性,只能使用float来浮动每个li元素,写起来比 ...
- 怎么在vue-cli中利用 :class去做一个底层背景或者文字的点击切换
// html <div class="pusherLists" :class="{hidden: isHidden}"> <span @cl ...
- Java中的session详解
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
- 将Eclipse项目转换成AndroidStudio项目过程中遇到的问题以及解决方法
将Eclipse项目转换成AndroidStudio项目也不是第一次了,昨天转的时候遇到几个问题: 首先将项目导入androidstudio,导完后报错: 问题一: Error:java.util.c ...
- 【记录】Nginx错误could not build the server_names_hash you should increase server_names_hash_bucket_size: 32
今天遇到这个错误,现记录下解决方案: 在nginx的配置文件的http段中增加如下配置: server_names_hash_bucket_size 64; 下面是nginx官方文档解释: 如果定义了 ...
- systemd-tmpfiles - Operation not permitted chown ; systemd-modules-load.service
systemd-tmpfiles-setup.service fail 一般为 /exports/rfs/var/lib/systemd/ 下的文件属性问题 , chown -R root:r ...
- JS window对象 userAgent 返回用户代理头的字符串表示(就是包括浏览器版本信息等的字符串) 语法 navigator.userAgent
userAgent 返回用户代理头的字符串表示(就是包括浏览器版本信息等的字符串) 语法 navigator.userAgent 几种浏览的user_agent.,像360的兼容模式用的是IE.极速模 ...
- 同一子网建立ssh通道,映射到本地
在办公室有一台机器连入同一子网络,开启jupyter-notebook但是只能在这台机器上访问到,怎样可以在家也可以访问呢? 此时最简单的方法是在本地建立一个ssh通道: 在本地终端中输入 ssh u ...
- webpack output.publicPath
output.publicPath string function 对于按需加载(on-demand-load)或加载外部资源(external resources)(如图片.文件等)来说,outpu ...
- webpack配置(使用react,es6的项目)
const path = require('path');const webpack = require('webpack');const HtmlWebpackPlugin = require('h ...