日期:2014-05-16  浏览次数:20446 次

<<让oracle跑的更快1>>读书笔记2
1 绑定变量
    1)硬分析和软分析
      硬分析需要判断是否已经在共享池中,如果有的话,则直接拿出来,马上可以执行,速度快,
为软分析;否则需要语法解析,语义分析,生成操作计划等,为硬分析。
    2) 绑定变量的话
       比如select * from xx where account_name=:x
    好处在于只要对每一种SQL一次硬分析,因为谓词不同而已。

  3)OLTP必须绑定变量而OLAP不应该绑定,因为OLAP中,硬分析的
代价基本可以忽略,但必须确切知道谓词的数值
  4)bind peaking,就是在硬分析时,ORACLE会看一下
当前谓词的值,以便生成最佳执行计划,但也只是第一次执行时生成,
以后不会执行。因为OLTP相同的SQL重复频率高,如果反复
解析SQL,必然很大消耗系统资源,执行的计划都很一致,bing peeking
第一次获得了正确的计划后,以后的SQL都会按这个计划执行


2 SQLTRACE的使用
  
   1)alter session set tracefile_identifier='mytest';
      设置生成trace的文件标识,可以方便追踪
    2)alter session set sql_trace=true;//启用sqltrace
    3) 执行SQL语句后,再停止sqltrace,可以在admin/sid/udmup下找到相关的trace文件
   4) 使用tkprof工具
     tkprof xxxx.trac out.txt 后加各种参数
     A explain=username/password,输入SQL的执行计划,如果不用explain,则看到的
是执行路径
     B SYS=NO,可以过滤SYS用户的操作建议使用
    C aggragate=yes,把相同的SQL在输入文件中作合拼,如果为NO,则分别输出每个SQL
的信息
    D sql的3个步骤:分析,执行,数据提取
    E 各参数的意义
        cpu:单位秒
        elapsed:当前的操作一共用时多少(包括CPU事件和等待时间)
        disk:磁盘物理读
         query:当前的操作一致性读方式读取的数据块数(通常为查询使用的)
         current:当前操作的current的方式读取数据块数(通常为修改的)
         rows:行数
   Misses in library cache during parse:1 为硬分析,为0为软分析

   OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS :递归SQL语句的分析



3 10046事件
     1)level=4:等同于sql_trace功能
        alter session set events '10046 trace name context forever,level 4';
     2)level=8 :没有绑定变量的值,但它比sql_trace增加了等待事件的信息
     3)level=12,等于level=4+level=8
4 10053事件
    解决的是为什么CBO会选择这个方式,将列出其执行过程。
   1) 设置
       alter session set events '10053 trace name context forever,level 1';
    2)取消
        alter session set events '10053 trace name context off';
    3)tkprof不能阅读10053事件,只能读10046事件
    4)10053事件中,比较重要的CLUF索引聚合因子,它表示索引上的键值和原表上的
数据分布的一种关系,当索引键值和表中数据的排列顺序大致相同时,它意味着索引
键指向的数据块越集中,这个因子越小,越有利于索引的使用;相反,当索引键指向的
数据快越多时(数据排序和索引相差越大)时,这个因子就越大,越不利索引的使用。
     可以使用alter table t1 minimize records_per_block;

5 性能视图和性能参数
    1)v$sql
         可以查到这个用户正在执行的SQL语句及这条SQL运行了多长,有什么等待
事件
    先查询当前用户连接的sid,然后执行
select a.sql_text,b.status,b.last_call_et,b.event from v$sql a,v$session b
where a.sql_id=b.sql_id and b.sid=xxxx; //只能10G用,9I不行
    
   不是所有的sql语句都能在该视图中找到,可以用手工清空共享池的信息,比如
    alter system flush shared pool;
    select sql_text,parse_calls,executions from v$sql where sql_text like 'select * from xxxx';
    可以找出语句分析和执行了多少次

   2)v$session
        select  machine,username,program,module from v$session;
       v$session里面有个字段last_call_et(秒)
      active:从session变成active到现在的时间
      inactive:从session状态变为incative到现在的时间