当前位置:操作系统 > Unix/Linux >>

CBO学习---第1章--What do You Mean by Cost

CBO学习---第1章--What do You Mean by Cost
 
第1章 Cost的含义(What do You Mean by Cost?)
 
Cost(代价/成本)的两方面含义:
(1)explain plan工具产生的神奇数字
(2)执行SQL的实际资源消耗
其实Cost就是优化器执行计算的结果.
本书主要学习:优化器如何产生Cost的.
 
1.1优化器选项
CBO(基于代价/成本的优化器)的3个变体(varians)
通过参数optimizer_mode控制
 
查看和修改方式:
[sql] 
SQL> show parameter optimizer_mode    
    
    
NAME                                 TYPE                   VALUE    
------------------------------------ ---------------------- ----------    
optimizer_mode                       string                 ALL_ROWS    
    
    
SQL> alter session set optimizer_mode=first_rows;    
SQL> show parameter optimizer_mode    
    
    
NAME                                 TYPE                   VALUE    
------------------------------------ ---------------------- ----------    
optimizer_mode                       string                 FIRST_ROWS  

 

 
参数optimizer_mode的可用值:
[sql] 
all_rows       --最短时间内完成语句的执行计划    
first_rows_N   --N=1、10、100、1000,彻底分析第一个join order,估计返回的总行数,重新优化,先返回前N行,再继续执行。    
first_rows     --9i中已过时,快速返回第一行。其中有多个高层约束:避免merge join和hash jion,除非只能跟全表扫描的第二张表进行nested loop连接。    
rule           --已废弃,内部部分语句有hint/*+rule*/    
choose         --介于role和all_rows之间    

 

 
参数optimizer_dynamic_sampling,控制对没有统计信息的表是否进行动态采样,2是(10g默认),1否(9i默认)
 
#脚本分析,代码包附件中
关于optimizer_mode=first_rows的cost分析,路径\ch_01_cost\下
[sql] 
first_rows.sql  
first_rows_08.txt  
first_rows_09.txt  
first_rows_10.txt  

 

代码中构建了一个10000行的表,表上有主键和一个普通列的B树索引;
optimizer_mode=first_rows下,执行6种查询,体现不同版本下,不同的条件对优化器的影响而产生不同的Cost值.
 
代码中,隐藏参数“_sort_elimination_cost_ratio”--不走sort的cost与走sort的cost的比率控制参数,具体控制如下:
如果不走sort的cost/走sort的cost >  _sort_elimination_cost_ratio,那么执行计划会走排序.
如果不走sort的cost/走sort的cost <  _sort_elimination_cost_ratio,那么执行计划不会走排序.
 
_optimizer_cost_model=choose,10g将自动激活cpu costing的模式,即当没有收集system statistics时,默认采用noworkload system statistics
 
1.2Cost的定义
 
有时CBO会产生错误的Cost,其原因:
(1)Cost model某些假设不适用
(2)数据统计信息可用,但误导
(3)数据统计信息不可用
(4)不了解硬件性能
(5)不了解当前负载(workload)
(6)代码bug
 
CBO进化历程:
(1)8i的opt只计算IO次数(the # of IO requests)
(2)9i引入CPU costing
[sql] 
CPU costing model:  
    Cost = (  
    #SRds * sreadtim +  
    #MRds * mreadtim +  
    #CPUCycles / cpuspeed  
    ) / sreadtim  
[sql] 
---------------------------------------------------------------------------------  
[sql] 
#SRDs - number of single block reads  
#MRDs - number of multi block reads  
#CPUCycles - number of CPU Cycles  
sreadtim - single block read time 单位毫秒  
mreadtim - multi block read time 单位毫秒  
cpuspeed - CPU cycles per second 单位MHz  

 

  (3)10g引入offline optimizer
以profile形式存储关键的统计信息,通过提示方式,帮助online optimizer加强查询
 
1.3变型(transformation)和代价计算(costing)
 
SQL变型:在计算cost之前,将SQL语句等价变形。
变形准则:
(1)SQL不能变型
(2)如果能变型,就变型
(3)能变形,但代价太大,就不变型
 
隐形参数“_complex_view_merging”,false(8i),true(9i),控制SQL中有view存在时,是否将view定义读入SQL,再进行等价变型和优化。(8i中该参数设置成true,有时也控制不住)
#脚本分析,代码包附件中
路径\ch_01_cost\下
[sql] 
view_merge_01.sql  
view_merge_01_08.trc  
view_merge_01_08.txt  
view_merge_01_09.trc  
view_merge_01_09.txt  
view_merge_01_10.trc  
view_merge_01_10.txt  

 

 
通过修改参数“_complex_view_merging”和加入hint来控制SQL语句的执行计划
 
在执行优化之前,还要执行一些操作,如下:
谓词推进(predicate pushing):通过传递闭包(transitive closure)产生谓词和从约束中产生谓词
非嵌套子查询(subquery unnesting)
星型变型(star transformation)
 
附件:
/2013/0719/20130719095917100.rar
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,