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