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

oracle学习2
1 IBM提出的QUBE模型
  响应时间=随机读的次数*10ms+顺序读的次数*0.01ms+处理的记录数*0.1ms

2 谓词:SQL中的那些条件,比如where子句
  selectivity:过滤比率,比如100条记录,查找后只有15条,则cardinality为15,即

oracle执行
计划中的rows一列,而 selectivity为0.15.
3 全表扫描,会读高水位线以下的数据。使用的是多块读的方法,每次读的数据块数量是

db_file_mulitiblock
_read_count参数控制

4 聚簇因子(dba_indexes视图中的clustering_factor,如果该值低,表示记录在表中的

顺序
也是按这个索引的数据保存,二者匹配,速度快,否则该值高,则数据记录在表中的保存

顺序和
索引顺序偏离很远,则这个值很高,效果不好

5 NEST LOOP,
  比如A,B表select a.*,b.* from a,b where a.id=p.id,
   其中一个表为驱动表,比如A,另外一个表为被驱动表,比如为B
则先读取A表的第一条记录,然后遍历驱动表B,根据条件a.id=p.id找到符合的记录,每

找到一条返回给用户
继续重复找A表中的所有记录直到被处理完。

6 soft merge:
   连接表的两个表的地位一样,把每个表按连接顺序排序,生成排序集,然后通过对两

个排序集各进行
一次遍历就可以获得结果集合,对每个表先进行排序,排序后两表都要进行遍历。
   oracle中,OMem,1Mem,0/1/M三列分别为采用内存中排序,1路排序,多路排序所需要

站用的内存的估算量
7 HASH JOIN:
   对驱动表A构造哈希桶,全表扫描A的所有记录,在ID列上构造哈希桶
以全表方式扫描B,依次对B的每条记录在b.p_id上用相同的哈希算法算值,然后跟A的桶

碰撞检测。

  HASH JOIN构健在PGA中,对它的访问不需要LATCH机制

8 oracle对于in,exists的优化是提前终止连接,比如A代表部门,B代表员工
   select ... from A where a.id in (select * from b),找出有员工的部门,则对于A

表中的某条记录,
只要在B中发现一条匹配的,则停止对B的查找,继续处理A的下一条记录,也叫semi-

join.
  从9I开始,in 和exists执行计划一样

9 NOT EXISTS中,不关心子查询是否有null,直接返回,但not in中如果有null,则返回

NULL,
oracle会把not in转换为not exits,但由于用了nvl隐藏函数,使得上面的索引不可用,
降低效果

10 并行度:
   slave proceess:真正并行干活的进程
   query coodinator:指挥进程,负责协调调度
  当多套并行操作时,涉及producer/consumer机制,table queue则为Orale
使用SGA方式作为进程间数据传递的通道,当producer向table quere写数据时,叫PX

SEND
当cousmmer向table cahce写数据,叫PX RECEIVE,当query coodinatore从table queue
读数据时,对应px coodinator;每套producer,cosumner有一对应的table queue
  show parameter parallel,table queue一定要放到large pool里中去(使用SGA自动调


即可)



11 oracle 9i前,一直坚持使用的是内存优先的原则,考虑的是内存命中率,而10G开始
使用的等待事件。AWR完成数据收集后,会触发addm(数据诊断监控程序),会给出修改的

意见。
  1) statistics_level参数
       有basic,typical,all三个值,缺省为typcal,all收集更详细的数据,可以借助
v$statistics_level视图
    AWR收集到的信息最初被保存在SGA的shared pool中,但最多使用5%的空间,当达到

限制要写到磁盘,MMON进程负责固定时间去写。
   2)默认每个小时产生1次快照,保留时间7天
     select * from dba_hist_wr_control;
   修改AWR的收集间隔,改为每30分一次:
     execute dbms_workload_repository.modify_snapshot_settings

(interval=>30,retention=>14400);
  3)使用
     @awrrpt (脚本在oracle_home/rdbms/admin下)

  4)ASH(即时数据分析),以秒为单位,只收集v$session和v$session_wait中的信息
,ASH使用的空间从v$sgastat中看:
   select pool,name,bytes/1024/1024 from v$sgastat where name like 'ASH%';
  5)表监控
     监控对象上发生的对象变更(CRUD),如果发生改变的数量超过总数10%,则重新统计
   select * from v$statistics_level
    如果发现modification monitoring中的列为typical,则证明启动了动态监控
  6)用动态数据收集,把对象的统计信息设置为null,当遇到一个
对象的统计信息为null时,会动态收集其统计信息,
  select /*+ dynamic_sampling(a 2) */ * from a
    a为表名,2为采样的是2倍的缺省的数据块数量(32)
  7) 查看默认的统计信息保留历史
     select dbms_stats.get_stats_history_retention from dual;
   修改保留策略
     execute dbms_stats.alter_stats_history_petention(45);

导入导出统计信息
    可以将生产环境的统计信息导出到开发库中,模拟生产环境,借助中间表来实现

    在使用DBMS_STATS分析表的时候,我们经常要保存之前的分析,以防分析后导致系统

性能低下然后进行快速恢复。

1、首先创建一个分析表,该表是用来保存之前的分析值:

SQL> begin
2 dbms_stats.create_stat_table(ownname=>'TEST',stattab=>'STAT_TABLE');
3 end;<