|
最初由 grassbell 发布
[B]
恩,eygle的例子可以让我们明白这个参数的原理。我们也知道这种方法只针对在这个表上的这条特定的sql起作用。biti_rainy提到兴许可以根据system event 数据来调整。原文中也提到,
SELECT EVENT,AVERAGE_WAIT
FROM V$SYSTEM_EVENT
WHERE EVENT LIKE ‘db file s%’;
EVENT AVERAGE_WAITS
========================= ==============
db file sequential reads .33178629
db file scattered reads 2.190087
这样就可以得到optimizer_index_cost_adj =0.33/2.1*100=15,对于这一点,我一直有点迷惑。
帮帮讲讲作者的意图好吗? [/B]
db file sequential reads -------- 往往象征(不是等价于)了索引扫描的等待
db file scattered reads --------- 象征了FTS(不是等价于)的等待
由于 optimizer_index_cost_adj 是一个衡量索引与全表扫描之间的分界点的平衡参数,于是,假定现在 全表扫描 产生的等待 就是其 cost ,假定索引查询的等待就是其 cost 。在系统级来观察,近似地认为就是这两个事件来衡量系统的这个参数。
optimizer_index_cost_adj = 100 的时候,观察系统的这两个等待事件,就可近似的认为:
全表扫描的代价 : 索引扫描的代价 = db file scattered reads : db file sequential reads
针对当前系统的事实,optimizer_index_cost_adj 本质上就是为了描述 索引扫描成本占全表扫描的成本的百分比。这个值越接近真实,则越能更好地给优化器提供选择执行计划的依据。所以正好可以参考下面的计算来设置这个值
optimizer_index_cost_adj = 索引扫描代价 / 全表扫描代价 = file sequential reads / db file scattered reads
注意这里的这个等式的含义和 eygle文章中 的 优化器选择的表达式并不是矛盾的,表达了不同的含义。这里是要设置的数据,使得和系统真实状况尽力一致,他那里是利用这个设置好的参数来评估 执行计划的选择 |
|