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

CBO学习---第2章--表扫描(Tablescans)

CBO学习---第2章--表扫描(Tablescans)
 
CBO的4种策略:
 
(1)传统策略:IO次数  (oracle7)
(2)SS1=IOST  --系统统计(system statistics,针对操作系统的统计信息)1;IO的大小和时间  (oracle8i)
(3)SS2=IOST+CPU--增加了CPU Costing(oracle9i)
(4)SS3=IOST+CPU+Cache--增加了缓存的说明(oracle10g)
Oracle7是传统策略,后面版本陆续增加CBO功能,Oracle9i引入CPU,10g进一步加强。SS2是normal变体。
隐藏参数“_optimizer_cost_model=io”,使优化器处于SS1,不计算CPU等,即使有workload参数,也不会用其参与计算
/**************************************************************************************************************************************/
2.1Getting Started
查看执行计划的方法:
 
本书提供的方法:
在本章的代码附件中,存在下面两个脚本
[sql] 
plan_run81.sql  
plan_run92.sql  
 
运行该脚本之前,在相对路径下建立一个名为target.sql的文件,在该文件中,写下需要查看执行计划的SQL语句。并在SQLplus中运行该脚本,如:
[sql] 
SQL> @plan_run81  
  STATE_ID  
----------  
    110004  
  Id  Par  Pos  Ins Plan  
---- ---- ---- ---- ---------------------------------------------------------  
   0         3        SELECT STATEMENT (all_rows)     Cost (3,14,1218)  
   1    0    1    1     TABLE ACCESS TABLE SCOTT EMP (full)  Cost (3,14,1218)  
  
  
Output file is     110004.lst  
--则会打出相应的执行计划,并输出于110004.lst文件中。  
SQL> @plan_run92  
会话已更改。  
  STATE_ID  
----------  
    110004  
已选择 1 行。  
已解释。  
  Id  Par  Pos  Ins Plan  
---- ---- ---- ---- -----------------------------------------------------------------------------------  
   0         3        SELECT STATEMENT (all_rows)     Old Cost (3,14,1218) New Cost (3,39667,0)  
   1    0    1    1     TABLE ACCESS TABLE SCOTT EMP (full)  Old Cost (3,14,1218) New Cost (3,39667,0)  
Output file is     110004.lst  
--其中New Cost (3,39667,0),括号中第二个值是CPU操作次数,第3个值是tempspace占用字节  
 
注意:要及时了解Oracle的最新发展情况,就必须密切关注dbmsutl.sql和dbms_xplan包。(有机会做的对比专题)
 
 
/**************************************************************************************************************************************/
最常用方法:sqlplus的自动追踪
 
[sql] 
SQL> set autot trace exp  
SQL> select * from emp;  
  
  
执行计划  
----------------------------------------------------------  
Plan hash value: 3956160932  
  
  
--------------------------------------------------------------------------  
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
--------------------------------------------------------------------------  
|   0 | SELECT STATEMENT  |      |    14 |  1218 |     3   (0)| 00:00:01 |  
|   1 |  TABLE ACCESS FULL| EMP  |    14 |  1218 |     3   (0)| 00:00:01 |  
--------------------------------------------------------------------------  
  
  
Note  
-----  
   - dynamic sampling used for this statement  
 
/**************************************************************************************************************************************/
本书示例最初环境如下:
(1)db_block_size=8192
(2)db_file_multiblock_read_count=8
(3)本地管理的表空间       
(4)统一extent大小1MB      
(5)freelist的块管理       
(6)optimizer_mode=ALL_ROWS)
(7)cpu_costing最初禁用(alter session set "_optimizer_cost_model"=io;)
 
/**************************************************************************************************************************************/
本章代码附件中:
[sql] 
tablescan_01.sql  
通过pctfree 99 构建了一个10000行,且跨越10000个块(实际分配了10240个块,高水位线在10000个块上)的表
该脚本清除了系统统计,关闭了CPU_Costing计算。
[sql] 
exec dbms_stats.delete_system_stats;  
alter session set "_optimizer_cost_model"=io  
 
执行结果:
[sql] 
SQL> sta tablescan_01  
会话已更改。  
PL/SQL 过程已成功完成。  
drop table t1  
           *  
第 1 行出现错误:  
ORA-00942: 表或视图不存在  
PL/SQL 过程已成功完成。  
表已创建。  
PL/SQL 过程已成功完成。  
会话已更改。  
  
  
db_file_multiblock_read_count = 4  
执行计划  
----------------------------------------------------------  
Plan hash value: 3724264953  
  
  
-----------------------------------------------------------  
| Id  | Operation          | Name | Rows  | Bytes | Cost  |  
-----------------------------------------------------------  
|   0 | SELECT STATEMENT   |      |     1 |     4 |  2431 |  
|   1 |  SORT AGGREGATE    |      |     1 |     4 |       |  
|   2 |   TABLE ACCESS FULL| T1   | 10000 | 40000 |  2431 |  
-----------------------------------------------------------  
Note  
-----  
   - cpu costing is off (consider enabling it)  
     
会话已更改。  
db_file_multiblock_read_count = 8  
执行计划  
----------------------------------------------------------  
Plan hash value: 3724264953  
  
  
-----------------------------------------------------------  
| Id  | Operation          | Name | Rows  | Bytes | Cost  |  
-----------------------------------------------------------  
|   0 | SELECT STATEMENT   |      |     1 |     4 | &nb
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,