- 浏览: 398973 次
- 性别:
- 来自: 上海
最新评论
-
liuwenlong62555:
...
Linux防火墙的关闭和开启 -
baolong101010:
永久关闭:chkconfig --level 2345 ipt ...
Linux防火墙的关闭和开启 -
lijie1819:
3)查看防火墙状态chkconfig iptables --l ...
Linux防火墙的关闭和开启 -
Annah:
总结的很好,谢谢
Vector和ArrayList区别 -
celavi:
非常好的文章,谢谢分享!
ORACLE SQL TUNING
cost of b-tree access
这一节我们看看CBO是如何来计算最普通的b-tree索引的访问的cost的。 我们知道B-tree索引的结构是一个树状结构,索引中包括root block,branch block, leaf block,这些结构分别相当与树的根,茎和叶。 我们知道CBO的Cost包括IO的cost和CPU的cost,而Oracle认为每一个single block access都是一个真实的IO,所以如果我们启动CPU的cost,访问索引的Cost就是访问索引的Block个数。 访问索引的cost可以用下面的公式来表示: cost = blevel + 第一行的blevel是指为了访问一个leaf block,我们需要访问的block的个数(不包括leaf block本身),Oracle总是维护一个Balanced B-trees,也就是说不管访问哪桓鰈eaf block,我们需要访问的中间block(包括root block和branch block)的个数都是一样多的。这个blevel也常常被称为索引的高度。 第二行是指我们的查询需要访问的leaf block的个数。 第三行是指为了获取我们需要的所有数据,我们需要访问的表的block的个数。 我们来做个实验来验证上面的公式。 1) 建表,建索引并收集统计数据: create index t1_i1 on t1(n1, ind_pad, n2) begin 我们查询表和索引的统计信息: TABLE_NAME BLOCKS NUM_ROWS (HWM下有371个block,一共有10000行) select NUM_ROWS DISTINCT_KEYS BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY (索引上一共有10000行, 这里简单解释一下几个概念: 2,cluster_factor, 下面是一个cluster_factor=10的图示:
实验1
先做个简单的实验: Execution Plan 我们看到索引本身RANGE SCAN的Cost=5,Card=20, 最后的总cost是25,也就是table的访问cost是20,按照我们个公式: cost = blevel + 放在一起我们得到 从这个例子里我们发现表本身的cost占绝大多数,这是因为这个索引的clustering_factor很大。很多时候我们都希望重建索引可以大大提高提高索引的效率,但要记住重建索引只能减少leaf_blocks的值(能减少多少取决于索引的具体情况),但实际上有时候真正影响更大的是clustering_factor(当然有时候是leaf_blocks,取决于具体情况)。 实验2
我们在条件里面加一个范围查询: select Execution Plan 首先我们加了一个/*+ index(t1) */强制使用索引,否则这个查询会选择full table scan,因为如果你实验一下或按照我们以前介绍的方法算一下,这个表的full table scan的cost只有58。 selectivity (n2 between 1 and 3) = Effective index selectivity = 1 * 0.04 * 0.205263 = 0.0082105 实验3
我们修改一下上面的SQL: alter session set "_optimizer_skip_scan_enabled"=false; Execution Plan 我们这里修改_optimizer_skip_scan_enabled为false,这样CBO就会使用Cost更低的Index skip scan。 这次我们发现总的cost相当高,但是按照公式计算: Effective index selectivity= 0.163333*1*0.05=0.0081667 我们的公式结果和explain plan里的显示差很多,这是为什么呢? 第二组: ..... 第二十五组:
cost= 2 + 在Oracle9i的plan_table里面引入了两个新的列: 这里access_predicates列出访问索引是被使用了的条件,filter_predicates列出被忽略了的条件。
我们知道8i开始有一个和索引有关的参数:OPTIMIZER_INDEX_CACHING,官方关于这个参数的解释是: 也就是说,这个参数仅仅影响nested loops和in list中的index的使用,我们在其他的部分介绍nested loops,现在现看看对In-list的影响: 默认情况optimizer_index_caching = 0 select
select
select Execution Plan
alter session set optimizer_index_caching = 75; select Execution Plan
select Execution Plan 不是很清楚具体是怎么计算了,看上来好像是只影响Index部分的cost,比如原来的cost是9,当设置optimizer_index_caching =75之后,那么新的cost= trunc(9*0.25)=2。 8i引入的和index有关的另一个重要的参数是optimizer_index_cost_adj,我们知道在8i里面CBO是不知道单块读和多块读的区别的,而这个参数就是为了弥补这个问题,默认值100是说单块读和多块读的cost一样,当我们调小这个参数值以后,CBO认为单块读比多块读的cost小,否则如果调大,CBO会认为单块读比多块读cost大。optimizer_index_cost_adj的问题在于它并不是影响CBO对多块读的cost,而是影响CBO对单块读的cost,这其实是个有问题的逻辑,因为合理的思维是应该调整多块读的cost,所有有的时候可能会导致CBO本来选择了一个较好的索引,但调整了optimizer_index_cost_adj后会选择一个较差的索引。从这个角度来说9i的system statistics就是调整多块读的cost,所以system statistics是更加合理的,而且system statistics是可以在真实环境中收集信息的,所以也比我们估计optimizer_index_cost_adj来的合理。 |
发表评论
-
一次oracle无法open的解决
2009-01-16 13:59 3617这几天因为公司的复杂查询出现性能的问题(说实话本来就没设计好, ... -
Oracle10g 自动共享内存管理
2009-01-14 13:25 38815.6 自动共享内存管理 从Oracle 10g开始,Or ... -
如何改善Oracle的索引
2009-01-12 16:40 15261、速度因素 PARALLEL选项:当创建索引时,O ... -
Oracle latch竞争总结(一)
2009-01-07 11:38 2842在Oracle中,Latch的概念是非常重要的,v$l ... -
PX Deq: Execute Reply 案例说明
2009-01-03 09:55 29981 背景:Oracle 数据库在执行sql时,会自动的选择较 ... -
MySQL优化经验——第一讲
2008-12-28 19:41 1350今天突然想起自己 ... -
oracle中对workarea_size_policy和sort_area_size的总结
2008-12-19 12:06 8832在实际的工作中,想必很多人会对SORT_AREA_SIZE和s ... -
Oracle专用服务器与共享服务器的区别
2008-12-19 11:51 3350在建立Oracle数据库的时候,应该会在数据库建立助手向导上面 ... -
Oracle高级SQL调优:CLUSTER_FACTOR案例研究
2008-12-18 22:27 1809大家在大型数据库生产系统的运维中可能会遇到这样一个问题,一条查 ... -
Oracle分析函数RANK()|ROW_NUMBER()|LAG()使用详解
2008-12-16 14:58 3068ROW_NUMBER()的使用方法: ROW_NUMB ... -
index和rowid的一点关系
2008-12-16 14:18 1462相信很多朋友在rowid和index之间都会有些疑问,今天在w ... -
关于MySQL的查询缓存收
2008-12-13 21:21 1158关于MySQL的查询缓存收 原理 QueryCache(下面简 ... -
oracle 被锁,解锁,阻塞语句
2008-12-12 18:35 2635//查询被锁的表 select A.s ... -
通过Oracle10g的FLASHBACK_TRANSACTION_QUERY指定事务的历史信息
2008-12-12 13:05 3138在数据库操作中,我们经常会遇到余下情况: 1.莫名其妙数据被D ... -
对于Oracle中DML使用UNDO的一些看法
2008-12-11 17:53 1217insert操作回滚段中只记录这些记录的ROWID updat ... -
oracle中x$ksppi和x$ksppcv详解
2008-12-09 17:22 3351SQL> desc x$ksppi 名称 ... -
ORA-600 [2103]错误及CF enqueue竞争
2008-12-09 17:21 1200昨天,客户的一套Oracle 10.2.0.3 RAC环境遇到 ... -
Oracle的redo 和undo的区别
2008-12-05 15:26 2583redo--> undo-->datafile i ... -
从 v$session 视图获取客户端 IP 地址
2008-11-18 19:42 2614缺省从 v$session 中不能直接获得客户端 IP ... -
oracle中聚合函数RANK和dense_rank的使用
2008-04-18 17:23 1339聚合函数RANK 和 dense_rank ...
相关推荐
Oracle CBO 学习笔记之(1) : 深入理解Oracle Hash Join的代价模型及其执行流程:word,pdf,图例
CBO学习代码 Jonathan Lewis编写
cbooracle cbo
关于oracle的CBO下的HINT总结!
cbo数据库优化,数据性能,oracle性能分析优化
ORACLE CBO RBO 优化
A Look under the Hood of CBO - the 10053 Event
how_cbo_works
平安Oracle CBO 资料.doc
【Maclean Liu技术分享】拨开Oracle CBO优化器迷雾,探究Histogram直方图之秘_0321.pdf
CBO,RBO在ORACLE中的应用
asp.net cbo实现多行选中,里面有案例和dll..可以直接套用。。非常好用
基于CBO的Oracle的成本分析.pdf
matlab巴特沃斯代码CBO4过滤器 使用称为碰撞体优化 (CBO) 的元启发式优化技术,根据整数阶有理近似设计分数阶低通巴特沃斯滤波器的 MATLAB 代码 分数阶滤波器比整数阶滤波器具有更好的滚降频率。 但是实现分数阶...
Things_You_Should_Know_About_11g_CBO
asp.net cbo实现多行选中,里面有案例和dll..可以直接套用。。非常好用
C# cbo和dgv输入筛选下拉列表,可以直接套用。非常简单,好用
U9V5.0组件化实施方案实例指导_CBO-310 工作流,学习参考
数据库REDO日志挖掘与优化CBO执行计划查询.
主要介绍了Oracle的RBO和CBO详细介绍和优化模式设置方法,RBO即基于规则的优化方式(Rule-Based Optimization),CBO即基于代价的优化方式(Cost-Based Optimization),需要的朋友可以参考下