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;<