一、脚本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

1、确认当前会话信息

SQL> select distinct sess.SID     db_sid,

sess.SERIAL# db_serial#,

process.PID  db_process_id,

process.SPID os_process_id,

sess.PROGRAM

from v$mystat stat, v$session sess, v$process process

where stat.sid = sess.SID

and sess.PADDR = process.ADDR;

DB_SID DB_SERIAL# DB_PROCESS_ID OS_PROCESS_ID            PROGRAM

---------- ---------- ------------- ------------------------ ------------------------------------------------

125          7            19 2902                     sqlplus@Oracle11g (TNS V1-V3)/

2、执行测试sql

SQL> select t1.*,t2.* from t_0504 t1,t_0504 t2;

3、top监控下

[oracle@Oracle11g ~]$ top

top - 09:28:58 up 7 min,  2 users,  load average: 0.08, 0.11, 0.08

Tasks: 140 total,   1 running, 139 sleeping,   0 stopped,   0 zombie

Cpu(s):  1.2%us, 12.9%sy,  0.0%ni, 83.2%id,  0.0%wa,  1.3%hi,  1.3%si,  0.0%st

Mem:   2050516k total,   804104k used,  1246412k free,     9824k buffers

Swap:  2072344k total,        0k used,  2072344k free,   547280k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

2704 oracle    20   0 65656  13m 9628 S 18.6  0.7   0:05.47 sqlplus

4、printsql检查

SQL> exec printsql(i_n_id => 2902,i_vc_idtype =>'SPID');

--------------------------------------------------------------------------------------

select t1.*,t2.* from t_0504 t1,t_0504 t2

--------------------------------------------------------------------------------------

The session id is 125

The status is INACTIVE

The sql hash value is 2172605583

The prev hash value is 3223926534

The osuser is oracle

The machine is Oracle11g

The terminal is pts/1

The program is sqlplus@Oracle11g (TNS V1-V3)

The event is SQL*Net message from client

感觉printsql 有点鸡肋

三、 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优化(崔华著)-整理笔记-工具集的更多相关文章

  1. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)

    基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编   ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...

  2. 基于oracle的sql优化

    [基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...

  3. 转://从一条巨慢SQL看基于Oracle的SQL优化

    http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...

  4. 从一条巨慢SQL看基于Oracle的SQL优化(重磅彩蛋+PPT)

    本文根据DBAplus社群第110期线上分享整理而成,文末还有好书送哦~ 讲师介绍 丁俊 新炬网络首席性能优化专家 SQL审核产品经理 DBAplus社群联合发起人.<剑破冰山-Oracle开发 ...

  5. 读书笔记-《基于Oracle的SQL优化》-第一章-3

    优化器: 1.优化器的模式: 用于决定在Oracle中解析目标SQL时所用优化器的类型,以及决定当使用CBO时计算成本值的侧重点.这里的“侧重点”是指当使用CBO来计算目标SQL各条执行路径的成本值时 ...

  6. 基于Oracle的SQL优化(崔华著)-整理笔记-第2章“Oracle里的执行计划”

    详细介绍了Oracle数据里与执行计划有关的各个方面的内容,包括执行计划的含义,加何查看执行计划,如何得到目标SQL真实的执行计划,如何查看执行计划的执行顺序,Oracle数据库里各种常见的执行计划的 ...

  7. 基于Oracle的SQL优化(崔华著)-学习笔记

    201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...

  8. 基于Oracle的SQL优化(崔华著)-整理笔记-第5章“Oracle里的统计信息”

    第5章“Oracle里的统计信息” 详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括 Oracle数据库中各种统计信息的分类.含义.收集和查看方法,以及如何在Oracle数据库里正确 ...

  9. Oracle之SQL优化专题01-查看SQL执行计划的方法

    在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...

随机推荐

  1. Oracle Schema Objects——Synonyms

    Oracle Schema Objects 同义词 同义词 = 表的别名. 现在假如说有一张数据表的名称是“USER1.student”,而现在又为这张数据表起了一个“USER1”的名字,以后就可以直 ...

  2. 配置oem

    [oracle@kaifai ~]$ export ORACLE_SID=dbking[oracle@kaifai ~]$ export ORACLE_SID=kaifai[oracle@kaifai ...

  3. php中函数preg_match或preg_match_all 第三个参数$match的解释

    理解自:http://www.cnblogs.com/vicenteforever/articles/1623137.html php手册中是这样解释的 matches 如果提供了参数matches, ...

  4. 模反元素 RSA Euler's totient function

    https://baike.baidu.com/item/模反元素/20417595 如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1.这时,b就 ...

  5. spring boot tomcat 线程数 修改初始线程数 统计性能 每百次请求耗时

    [root@f java]# tail -30 nohup.outsearchES-TimeMillisSpent:448P->1602@fT->http-nio-8080-exec-3t ...

  6. docker 数据管理数据卷

    1,数据卷 数据卷是一个可供容器使用特殊目录,他将主机操作系统目录直接映射容器 1,在容器内创建一个数据卷 在使用docker run命令的时候,使用-v标记就可以创建一个数据卷,多次重复使用-v可以 ...

  7. 将expression转化为数据类型int时发生算术溢出错误

    在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...

  8. python 面向对象 公有属性

    公有属性定义  公有属性也叫作类变量  静态字段 class role(): # 传参数 # 公有属性都在这里定义 # 在类里直接定义的属性即是公有属性 nationality = 'JP' def ...

  9. Java-idea-FindBugs字节码级别潜在bug查看

    一.概述 静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷. FindBugs 不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题. FindBugs 是一个静态分析工具,它检查类或 ...

  10. tcpdump-抓包工具-Linux

    环境:VMware-Workstation-12-Pro,Windows-10,CentOS-6.9-x86_64,Xshell5 基本介绍 tcpdump是Linux自带的抓包工具,可以详细看到计算 ...