基于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执 ...
随机推荐
- Oracle Schema Objects——Synonyms
Oracle Schema Objects 同义词 同义词 = 表的别名. 现在假如说有一张数据表的名称是“USER1.student”,而现在又为这张数据表起了一个“USER1”的名字,以后就可以直 ...
- 配置oem
[oracle@kaifai ~]$ export ORACLE_SID=dbking[oracle@kaifai ~]$ export ORACLE_SID=kaifai[oracle@kaifai ...
- php中函数preg_match或preg_match_all 第三个参数$match的解释
理解自:http://www.cnblogs.com/vicenteforever/articles/1623137.html php手册中是这样解释的 matches 如果提供了参数matches, ...
- 模反元素 RSA Euler's totient function
https://baike.baidu.com/item/模反元素/20417595 如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1.这时,b就 ...
- spring boot tomcat 线程数 修改初始线程数 统计性能 每百次请求耗时
[root@f java]# tail -30 nohup.outsearchES-TimeMillisSpent:448P->1602@fT->http-nio-8080-exec-3t ...
- docker 数据管理数据卷
1,数据卷 数据卷是一个可供容器使用特殊目录,他将主机操作系统目录直接映射容器 1,在容器内创建一个数据卷 在使用docker run命令的时候,使用-v标记就可以创建一个数据卷,多次重复使用-v可以 ...
- 将expression转化为数据类型int时发生算术溢出错误
在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...
- python 面向对象 公有属性
公有属性定义 公有属性也叫作类变量 静态字段 class role(): # 传参数 # 公有属性都在这里定义 # 在类里直接定义的属性即是公有属性 nationality = 'JP' def ...
- Java-idea-FindBugs字节码级别潜在bug查看
一.概述 静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷. FindBugs 不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题. FindBugs 是一个静态分析工具,它检查类或 ...
- tcpdump-抓包工具-Linux
环境:VMware-Workstation-12-Pro,Windows-10,CentOS-6.9-x86_64,Xshell5 基本介绍 tcpdump是Linux自带的抓包工具,可以详细看到计算 ...