基于Oracle的SQL优化(崔华著)-整理笔记-工具集
一、脚本display_cursor_9i.sql是可以得到SQL的真实执行计划,使用示例
使用示例,请看以下case
|
1、执行测试sql: SELECT T1.*,T2.* FROM T_0504 T1,T_0504 T2; 2、找出该sql的 HASH_VALUE、CHILD_NUMBER select t1.SQL_TEXT,t1.HASH_VALUE,t1.CHILD_NUMBER from v$sql t1 where t1.SQL_TEXT like 'SELECT T1,*,T2.* FROM T_0504 T1,T_0504 T2%'; ------------------------------------------------------------------------------------------------------------------------------ SELECT T1,*,T2.* FROM T_0504 T1,T_0504 T2 4015614548 0 3、现在执行脚本display_cursor_9i.sql是可以得到上述SQL的真实执行计划的: -------SQL> @'E:\display_cursor_9i.sql' HASH_VALUE CHILD_NUMBER SQL> @'E:\display_cursor_9i.sql' 4015614548 0 |
二、存储过程PRINTSQL.prc 打印对应spid或sid所对应的sql以及其执行计划,使用示例
|
输入参数: i_n_id: 输入的spid或sid i_vc_idtype : 输入的ID的类型,'SPID'表示输入的是spid,'SID'表示输入的是sid. 使用示例,请看以下case
|
三、 oracle自己的dbms_xplan包 ,使用示例。必须在执行sql之后马上执行哦
|
select * from table (dbms_xplan.display_cursor('sql_id/hash_value', child_cursor_number,'advanced')); |
四、XPLAN包-清晰地看到执行计划中每一步的执行顺序
|
XPLAN包其实是对DBMS__ XPLAN包的封装,使用XPLAN包就可以很清晰地看到执行计划中每一步的执行顺序。执行顺序在XPLAN包的显示结果中以列Order来显示,Order的值从1开始递增,表示执行顺序的先后。 使用示例,请看以下case 1、执行测试sql语句: SELECT T1.*,T2.* FROM T_0504 T1,T_0504 T2; 2、找出该sql的 HASH_VALUE、CHILD_NUMBER select t1.SQL_TEXT,t1.HASH_VALUE,t1.CHILD_NUMBER,sql_id from v$sql t1 where t1.SQL_TEXT like 'SELECT T1,*,T2.* FROM T_0504 T1,T_0504 T2%'; ------------------------------------------------------------------------------------------------------------------------------ SELECT T1,*,T2.* FROM T_0504 T1,T_0504 T2 4015614548 0 5d0g6kk0ryp4g 3.xplan检查该sql的执行计划附带各个执行步骤的先后顺序 select * from table(xplan.display_cursor('5d0g6kk0ryp4g',0,'advanced')) SQL_ID 5d0g6kk0ryp4g, child number 0 ------------------------------------- select t1.*,t2.* from t_0504 t1,t_0504 t2 Plan hash value: 4118920280 --------------------------------------------------------------------------------------- | Id | Order | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------- | 0 | 5 | SELECT STATEMENT | | | | 20M(100)| | | 1 | 4 | MERGE JOIN CARTESIAN| | 5258M| 950G| 20M (1)| 69:37:26 | | 2 | 1 | TABLE ACCESS FULL | T_0504 | 72517 | 6869K| 290 (1)| 00:00:04 | | 3 | 3 | BUFFER SORT | | 72517 | 6869K| 20M (1)| 69:37:23 | | 4 | 2 | TABLE ACCESS FULL | T_0504 | 72517 | 6869K| 288 (1)| 00:00:04 | --------------------------------------------------------------------------------------- 五、sosi.txt就是这样的一个脚本,SOSI是Show Optimizer Statistics Infonnation的缩写 指定要查看统计信息的表名就可以了。 sosi.txt支持分区表,它的显示分为三部分,分别是表级别的统计信息,分区级别的统计信息和子分区级别的 统计信息,其典型的显示结果为如下所示。 表级别的显示输出 分区级别的显示输出 子分区级别的输出 |
收集表的统计信息
|
对表T2收集统计信息,并且是以估算模式,采样的比例同样为I5%: soL> exec dbms_stats.gather_table_stats (ownname => 'SCOTT',tabname => 'T2',estimate_percent=> 15,method_opt -> 'FOR TABLE',cascade => false) ; PL/soL procedure successfully completed |
|
对表T2收集统计信息,并且是以计算模式收集,用DBMS_STATS包实现的方法就是将估算模式的采样比例(即参数ESTIMATE PERCENT)设为100%或NULL: SQL> exec dbms_stats.gather_table_stats (ownname => 'SCOTT',tabname => 'T2',estimate_percent=> 100,method_opt => 'FOR TABLE',cascade => false) ; PL/SQL procedure successfully completed SQL> exec dbrns_stats.gather_table_stats (ownname => 'SCOTT',tabname => 'T2',estimate_percent=> NULL,method opt => 'FOR TABLE' , cascade => false) ; PL/SQL procedure successfully completed 从如下内容可以看出,现在只有表T2有统计信息,表T2的列和索引IDX T2均没有相关的统计信息。 而且因为采用的是计算模式,计算模式会扫描目标对象的所有数据,所以统计结果和实际结果是匹配的,比如 表T2的实际数据量为71,964,这里Oracle计算出来的T2的数据量也是71,964: |
|
对表T2收集完统计信息后,对表T2的列OBJECT NAME和OBJECT ID以计算模式收集统计信息(不收集直方图): soL> exec dbms_stats.gather_table_stats (ownname => 'SCOTT',tabname => 'T2',estimate_percent=> 100,method_opt => 'for columns size 1 object_name object_id',cascade => false) ; PL/SQL procedure successfully completed |
|
以计算模式收集索引IDX_T2的统计信息: SQL> exec dbms_stats .gather_index stats (ownname => ' SCOTT ' ,indname =>'IDX_T2 ',estimate_percent =>100) ; PL/soL procedure successfully completed |
|
删除表T2、表T2的所有列及表T2的所有索引的统计信息 SQL> exec dbms stats.delete_table_stats (ownname => 'SCOTT' ,tabname => 'T2 ' ) ; PL/soL procedure successfuLly completed 从如下结果可以看到,我们刚才收集的表T2、表T2的列OBJECT NAME、OBJECT ID以及索引IDX T2 的统计信息已经全部被删除了: |
|
一次性以计算模式收集表T2、表T2的所有列和表T2上的所有索引的统计信息,执行如下语句就可以了: SQL> exec dbms_stats.gather_table_stats (ownname => 'SCOTT',tabname => 'T2',estimate_percent=> 100,cascade=> true) ; PL/soL procedure successfully completed |
基于Oracle的SQL优化(崔华著)-整理笔记-工具集的更多相关文章
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编 ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...
- 基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
- 转://从一条巨慢SQL看基于Oracle的SQL优化
http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...
- 从一条巨慢SQL看基于Oracle的SQL优化(重磅彩蛋+PPT)
本文根据DBAplus社群第110期线上分享整理而成,文末还有好书送哦~ 讲师介绍 丁俊 新炬网络首席性能优化专家 SQL审核产品经理 DBAplus社群联合发起人.<剑破冰山-Oracle开发 ...
- 读书笔记-《基于Oracle的SQL优化》-第一章-3
优化器: 1.优化器的模式: 用于决定在Oracle中解析目标SQL时所用优化器的类型,以及决定当使用CBO时计算成本值的侧重点.这里的“侧重点”是指当使用CBO来计算目标SQL各条执行路径的成本值时 ...
- 基于Oracle的SQL优化(崔华著)-整理笔记-第2章“Oracle里的执行计划”
详细介绍了Oracle数据里与执行计划有关的各个方面的内容,包括执行计划的含义,加何查看执行计划,如何得到目标SQL真实的执行计划,如何查看执行计划的执行顺序,Oracle数据库里各种常见的执行计划的 ...
- 基于Oracle的SQL优化(崔华著)-学习笔记
201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...
- 基于Oracle的SQL优化(崔华著)-整理笔记-第5章“Oracle里的统计信息”
第5章“Oracle里的统计信息” 详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括 Oracle数据库中各种统计信息的分类.含义.收集和查看方法,以及如何在Oracle数据库里正确 ...
- Oracle之SQL优化专题01-查看SQL执行计划的方法
在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...
随机推荐
- CodeForces Roads not only in Berland(并查集)
H - Roads not only in Berland Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d ...
- 分区实践 A PRIMARY KEY must include all columns in the table's partitioning function
MySQL :: MySQL 8.0 Reference Manual :: 23 Partitioning https://dev.mysql.com/doc/refman/8.0/en/parti ...
- OSX: 下载Flash Player的脚本
http://blog.csdn.net/cneducation/article/details/54742983
- 自旋锁原理及java自旋锁
一.自旋锁的概念 首先是一种锁,与互斥锁相似,基本作用是用于线程(进程)之间的同步.与普通锁不同的是,一个线程A在获得普通锁后,如果再有线程B试图获取锁,那么这个线程B将会挂起(阻塞):试想下,如果两 ...
- 小米范工具系列之六:小米范 web查找器2.x版本发布
小米范web查找器是一款快速识别端口及服务的小工具. 此工具使用java 1.8以上版本运行. 下载地址:http://pan.baidu.com/s/1c1NDSVe 文件名web finder ...
- (2.10)Mysql之SQL基础——约束及主键重复处理
(2.10)Mysql之SQL基础——约束及主键重复处理 关键词:mysql约束,批量插入数据主键冲突 [1]查看索引: show index from table_name; [2]查看有约束的列: ...
- mysql 数据类型 枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框 enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female set 多选 在给定的范围内可以选择一个或一个以上的值(爱好 ...
- mysql 数据操作 单表查询 简单查询 避免重复DISTINCT
创建数据库company create database company charset=utf8; use company; company.employee 员工id id int 姓名 emp_ ...
- 分布式存储之MogileFS基于Nginx实现负载均衡(Nginx+MogileFS)
MogileFS分布式文件系统特点: 1.具有raid的性能 2.不存在单点故障 3.简单的命名空间: 每个文件对应一个key:用于domain定义名称空间 4.不共享任何数据 5.传输中立,无特殊协 ...
- tp模板基础
目录简介 创建应用 在项目目录创建入口文件shop/index.php 创建虚拟主机,访问应 路由形式 路由: 系统从URL参数中分析出当前请求的分组.控制器.和操作的过程就是“路由”. Tp框架路由 ...