6、执行没有直方图之前查询
在没有直方图的情况下,在B列上进行等值查询的时候,都是索引范围扫描。
SQL> select * from tab where b=1;
执行计划
----------------------------------------------------------
Plan hash value: 439197569
----------------------------------------------------------------------------------------
| Id| Operation | Name | Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |1000 |6000 | 4 (0)| 00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID| TAB |1000 |6000 | 4 (0)| 00:00:01 |
|*2 | INDEX RANGE SCAN | IX_TAB_B |1000 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
SQL> select * from tab where b=5;
已选择9991行。
执行计划
----------------------------------------------------------
Plan hash value: 439197569
----------------------------------------------------------------------------------------
| Id| Operation | Name | Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |1000 |6000 | 4 (0)| 00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID| TAB |1000 |6000 | 4 (0)| 00:00:01 |
|*2 | INDEX RANGE SCAN | IX_TAB_B |1000 | | 2 (0)| 00:00:01 |
7、产生直方图 BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'ZFTANG',
TABNAME => 'TAB', CASCADE => TRUE,
METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO '); END;
/
收集直方图信息。看看是什么效果。由于列B唯一值的个数没有超过254因此产生的是等频直方图。
8、执行查询结果
在B=1时候采用索引扫描,而B=5时候,已经采用全表扫描了,说明直方图起了作用。
SQL> select * from tab where b=1;
执行计划
----------------------------------------------------------
Plan hash value: 439197569