---工具的简单介绍
 
001啥是autotrace,翻译自动跟踪,跟踪什么额? SQL的执行过程
  我们老是讲ORACLE体系结构里面,共享池有个组件库高速缓存,存放SQL语句执行计划
  什么硬解析,再一次就成软解析,什么物理读,逻辑读,谁知道呢!
  此次通过autotarce可以直观查看:
    002命令:  Show autotrace  查看参数状态
                Set autotrace on  打开
                Set autotrace traceonly 查看自动追踪显示过程+结果
                Set autotrace traceonly explain  显示过程
                Set autotrace traceonly statistics 显示结果
    003实验前准备:为了保证测试环境:清空缓冲区以及缓存区
                  *Alter  system flush shared_pool;
                  *Alter  system flush buffer_cache;
       (为了使用方便可以在ORACLE用户$,默认/HOME/ORACLE
                 Vi  xx.sql     保存退出,在SQL使用@xx,即可使用脚本)
    004:通过测试发现,此工具有很大局限性只能测验select/insert/update/delete

---测试一、开始使用工具

SQL> set autotrace traceonly;

SQL> select * from emp1 where deptno=10;

| Id  | Operation   操作选择     | Name | Rows  | Bytes | Cost (%CPU)| Time

| --------------------------------------------------------------------------

|   0 | SELECT STATEMENT 查询语句 |      |     3 |   114 |     4   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL全表扫描| EMP1 |     3 |   114 |     4   (0)| 00:00:01 |

Predicate Information (identified by operation id):  谓词信息,操作标识

1 - filter("DEPTNO"=10)   关键信息-部门10

Statistics 统计

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

0  recursive calls          递归调用

0  db block gets           数据块获取

7  consistent gets          一致性获取

0  physical reads         物理读

0  redo size               日志读

1150  bytes sent via SQL*Net to client         通过网络发送到客户端字节

523  bytes received via SQL*Net from client 通过网络接收到的字节

2  SQL*Net roundtrips to/from client           通过网络传输的往返次数

0  sorts (memory)      内存排序

0  sorts (disk)            磁盘排序

3  rows processed    结果行数

物理读=physical reads

逻辑度=db block gets  当前数据块获取  +   consistent gets  一致性获取

什么

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

-以上简单介绍完毕:具体分析,每个参数值的含义:

递归调用: 为了执行这条SQL语句,Oracle内部执行了几次的查询(权限,空间管理,结构)

SQL> select * from emp1;  --          0  recursive calls

操作:delete emp1 where rownum=1;

SQL> insert into emp1 select * from emp where rownum=1;

---以上做了两个测试,删除和插入一行新的数据,递归调用没有发生改变

SQL> alter table emp1 add abc date;

SQL> select * from emp1;           10  recursive calls

--还原环境=> alter table emp1 drop column abc;

--但是对表的结构发出改变后,递归调用发生改变=》

对表的结构发生改变,存入的是哪?数据字典,因此,递归调用的次数是查询数据字典;

什么操作会触发查询数据字典:空间管理,存储够不够,安全检查,权限够不够,表的结构是否发生改变;

db block gets 数据块获取

SQL> insert into emp1 select * from emp;

|  LOAD TABLE CONVENTIONAL

44  recursive calls

7  db block gets

43  consistent gets

SQL> select SEGMENT_NAME,BLOCKS from user_segments where segment_name='EMP1';

SEGMENT_NAME     BLOCKS

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

EMP1                              8

--实验猜测,是否是插入增加了七个块的改变数据,导致的查询

SQL> drop table emp1 purge;

SQL> create table emp1 as select * from emp;

SQL> select SEGMENT_NAME,BLOCKS from user_segments where segment_name='EMP1';

--再次查询--不会变化,因为Oracle按照区分配块的数量,一次8个;

SQL> analyze table emp1 compute statistics;  对表进行分析

SQL> select blocks,empty_blocks,avg_space,num_freelist_blocks from user_tables where table_name='EMP1';

--使用的块数量   未使用的块数量   平均每个块存储量       空闲列表的块的数量

BLOCKS          EMPTY_BLOCKS     AVG_SPACE       NUM_FREELIST_BLOCKS

4                            4                            7451                                                  0

SQL> insert into emp1 select * from emp;   |  LOAD TABLE CONVENTIONAL

SQL> analyze table emp1 compute statistics;

SQL> select blocks,empty_blocks,avg_space,num_freelist_blocks from user_tables where table_name='EMP1';

BLOCKS EMPTY_BLOCKS  AVG_SPACE NUM_FREELIST_BLOCKS
---------- ------------ ---------- -------------------
         8            0       7830                   0

----通过以上视图无法,insert 操作,导致表emp1的存储,多使用了四个块;

--我们开启追踪set autotrace traceonly工具,发现,DML操作(insert /update/delete)操作时,会有当前数据块读,

SQL> insert into emp1 select * from emp;   |  LOAD TABLE CONVENTIONAL

SQL> delete emp1 where rownum<14;     |   COUNT STOPKEY

SQL> update emp1 set deptno=40 where rownum<14; COUNT STOPKEY

14  recursive calls
         22  db block gets
         32  consistent gets

SQL> Alter  system flush shared_pool;   插入操作,未提交,做一个清空共享池、buffer_cache操作,再次查询,还是无法查询到db block gets的变化

SQL> Alter  system flush buffer_cache;

SQL> select * from emp1;

61  recursive calls
          0  db block gets
         60  consistent gets
         19  physical reads

小结: db block gets:是当前读(用于,delete,update,insert的DML操作的时候,产生的逻辑读中的当前读操作)会先读数据,在进行DML操作;

逻辑读= DML操作导致的读取    +  一致性读

logical read =db block gets + consistent gets

---什么是一致性读

1.需要读取的数据,在Buffer_cache中,没有发生改变;

2.如果早上8点,发出发出查询操作,8:05分数据块发生了改变,未提交,查询操作读取数据块,发现事物未结束,会复制数据块的镜像,使用Undo进行还原,让Oracle读取的数据一致;

3.如果早上8点,发出的查询操作,8:05分数据块发生了改变,并且提交了,块头记录事物的SCN号,发现比查询的SCN大,不行,继续复制块镜像,使用UNDO还原块镜像,能还原最好,如果undo数据被覆盖了,不好意思,01555错误,快照过久,历史的数据无法查询到了;

补充:3的补充,在8:05分后的查询,拿着最新的SCN号,去找8:05分提交的数据,对比SCN,发现小或者=,直接提取就OK 了。

physical reads  物理读

SQL>  Alter  system flush buffer_cache;  --清空buffer_cache中的所有数据块

select * from emp1;

8  consistent gets
          6  physical reads

?物理读,把需要查找的数据,已块为单位提取到buffer_cache中,为啥还有逻辑读呢?逻辑读在Buffer_cache都是空的

解释说明:谁去提取数据,DBWR进程只提供写,不提供从磁盘数据文件,提取到内存的操作不干,谁做?

我们为客户,client 端,一般默认专有服务器模式(dedicated server),我们分配一个server process进行VIP客户体验,一对一服务;那么他的操作,也是server process进程提供提取数据,是直接提取到pga给用户吗?

NO,首先server process进程拿着shared pool里面拿着执行计划,到Buffer cache中寻找数据,发现没有,就根据块的地址去数据文件找,找到后,提取数据,放置在buffer cache中,然后通过内存传输数据非常快的交给客户去看。

小结: 物理读的产生,是数据所在的块在Buffer cache中没有,从数据文件提取,物理读的产生也伴随着逻辑读的产生,物理读数据块是读到内存的Buffer cache中,不是直接读取到pga用户手上;

redo size 执行的操作产生的redo日志大小:

---查询会话产生的redo量
select a.name,b.value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name='redo size';

redo size                                                            480108

SQL> insert into emp1 select * from emp;

14 rows created.

SQL> select a.name,b.value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name='redo size';

redo size                                                            481024

SQL> select (481024-480108)/1024 from dual;

.89453125    --查询14行,产生了0.9k的日志量

3233  bytes sent via SQL*Net to client 通过SQL网络发送给客户端的字节

545  bytes received via SQL*Net from client通过网络接受客户端字节
          4  SQL*Net roundtrips to/from client   通过SQL网络去客户端的往返次数

sorts (memory)  内存排序:排序在内存中进行,也就是在PGA中进行;

select * from emp a,emp b order by a.ename

2  sorts (memory)

Alter  system flush buffer_cache;   --清空Buffer_cache

set autotrace traceonly;                  -开启追踪

SQL> create global temporary table abc on commit preserve rows as select * from dba_objects;  创建全局会话临时表;

select * from abc order by object_id;  ---显示结果,还是内存排序,并不是说,临时表,存储在临时表空间,排序的操作就在临时表空间内进行。还是优先在PGA中进行排序

SQL> show parameter pga          PGA内存自动管理

NAME                                 TYPE        VALUE

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

pga_aggregate_target                 big integer 0

SQL> select * from v$pgastat where name like 'maximum PGA used for auto workareas%';

NAME                                             VALUE UNIT      --查询PGA,的内存自动管理模式下分配的最大内存大小

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

maximum PGA used for auto workareas          115332096 bytes

select 115332096/1024/1024 from dual;

109.989258 M

sorts (disk)      :   磁盘排序

什么样的情况下会磁盘排序,首先什么时候会排序:

Order by ,distinct ,union 这些操作都会涉及到排序,排序优先在PGA中进行,因为在内存中排序很快;

然而,如果大量的排序,导致的后果就是内存迅速被填充满,最后不够用了,但是操作还是要继续,就在临时表空间内进行排序操作,也就是磁盘排序;

-------这种事要极力避免的,磁盘IO是瓶颈,内存速度是磁盘的千倍;

rows processed结果的记录数

执行计划查看,autotrace工具的使用的更多相关文章

  1. [terry笔记]oracle里的执行计划-查看

    内容主要来自看书学习的笔记,如下记录了常见查询执行计划的方法. 2.2 如何查看执行计划 1.explain plan 2.dbms_xplan包 3.autotrace 4.10046事件 5.10 ...

  2. PL/SQL执行计划查看

    一.如何查看PLSQL的执行计划 在SQl Window窗口输入sql语句,然后按键"F5",就会进入执行计划查看界面. 二.界面说明 首先我们看第二行有几个属性可以选“Tree” ...

  3. 获取执行计划之Autotrace

    Autotrace 简介 AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计. AUTOTRACE的好处是您不必设置跟踪文件的格式,并且 ...

  4. MySql 的SQL执行计划查看,判断是否走索引

    在select窗口中,执行以下语句: set profiling =1; -- 打开profile分析工具show variables like '%profil%'; -- 查看是否生效show p ...

  5. mssql执行计划查看的一些知识

    在MSSQL中,查看较慢语句的执行计划,就是一个比较直观的方式, 如果查看执行计划呢: 1.从右到左,从上到下的顺序阅读执行计划2.执行计划中每个图标代表一个运算符,总开销为100%3.数据从右向左在 ...

  6. mysql 执行计划查看

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈.explain执行计划包含的信息 其中最重要的字段为:id ...

  7. mysql执行计划查看工具explain

    在优化sql语句时,我们经常会用到explain语句,这里对explain语句做一个详细的总结说明. The EXPLAIN statement provides information about ...

  8. oracle 执行计划查看

    1)  sql command窗口里explain plan for select * from emp: 2) select * from table(dbms_xplan.display);

  9. Oracle数据库查看执行计划

    基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

随机推荐

  1. IOS SDWebImage实现基本原理详解(转载)

    1)当我门需要获取网络图片的时候,我们首先需要的便是URl没有URl什么都没有,获得URL后我们SDWebImage实现的并不是直接去请求网路,而是检查图片缓存中有没有和URl相关的图片,如果有则直接 ...

  2. RG_5

    必须发博纪念经过昨天的开车, 作业本终于做完啦!!! 可以认真的刷题了.

  3. java 对象的序列化与反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  4. 通过SQL脚本导入数据到不同数据库避免重复导入三种方式

    前言 无论何种语言,一旦看见代码中有重复性的代码则想到封装来复用,在SQL同样如此,若我们没有界面来维护而且需要经常进行的操作,我们会写脚本避免下次又得重新写一遍,但是这其中就涉及到一个问题,这个问题 ...

  5. 一款优秀的JavaScript框架—AngularJS

    AngularJS简介 AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.Angular ...

  6. 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya's Game。

    废话不多说,先上题目. 51nod Codeforces 两个其实是一个意思,看51nod题目就讲的很清楚了,题意不再赘述. 直接讲我的分析过程:刚开始拿到手有点蒙蔽,看起来很难,然后......然后 ...

  7. HSF服务的开发与使用

    1.HSF服务的开发 1) 基于Maven创建一个web工程HSFService,如下图,其他的可以自定义. 2)创建好好在src/main目录下创建一个java目录,并将其设置为sources fo ...

  8. Keyboard Row

    Given a List of words, return the words that can be typed using letters of alphabet on only one row' ...

  9. hdu 5954 -- Do not pour out(积分+二分)

    题目链接 Problem Description You have got a cylindrical cup. Its bottom diameter is 2 units and its heig ...

  10. php过滤textarea 中的换行符问题

    之前我写的替换代码是这样的 $content = str_replace('\r\n', '', $_POST['content']); 为了确保window和Linux的换行符都能去掉,改成这样的: ...