SQL> create table t -->创建测试表 2 as 3 select rownum as id, 4 round(dbms_random.normal*1000) AS val1, 5 dbms_random.string('p',250) AS pad 6 from dual 7 connect by level <=10000; Table created. SQL> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true); -->收集统计信息 SQL> @Tab_Stat -->从dba_tab_statistics中获得表对象的统计信息,此时无empty_blocks的信息 Enter value for input_table_name: t Enter value for input_owner: scott NUM_ROWS BLKS EM_BLKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN AVG_ROWS_PER_BLOCK LST_ANLY STA ---------- ---------- ---------- ---------- ---------- ----------- ------------------ --------- --- 10000 387 0 0 0 259 26 03-NOV-11 NO /**************************************************/ /* Author: Robinson Cheng */ /* Blog: http://blog.csdn.net/robinson_0612 */ /* MSN: robinson_0612@hotmail.com */ /* QQ: 645746311 */ /**************************************************/ SQL> analyze table t compute statistics; -->执行analyze SQL> @Tab_Stat -->此时的empty_blocks值为125 Enter value for input_table_name: t Enter value for input_owner: scott NUM_ROWS BLKS EM_BLKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN AVG_ROWS_PER_BLOCK LST_ANLY STA ---------- ---------- ---------- ---------- ---------- ----------- ------------------ --------- --- 10000 387 125 920 0 262 26 03-NOV-11 NO SQL> col segment_name format a15 SQL> select segment_name,segment_type,blocks,extents from dba_segments -->查看表段上的块的信息 2 where segment_name='T' and owner='SCOTT'; SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS -->此数据字典中记录的块数为512块(包含了已使用块与空闲块) --------------- ------------------ ---------- ---------- T TABLE 512 19 SQL> set autotrace traceonly; -->开启autotrace SQL> select count(*) from t; -->此时SQL语句的执行计划为全表扫描(执行计划中部分信息被省略) Execution Plan ---------------------------------------------------------- Plan hash value: 2966233522 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 86 (0)| 00:00:02 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T | 10000 | 86 (0)| 00:00:02 | ------------------------------------------------------------------- Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 375 consistent gets -->consistent gets的值为375 0 physical reads SQL> set autotrace off; SQL> delete from t where rownum<=9900; -->删除大多数的记录,删除后剩余记录值为100 9900 rows deleted. SQL> commit; SQL> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true); -->收集统计信息 SQL> analyze table t compute statistics; -->收集统计信息 SQL> @Tab_Stat -->此时对象上的统计信息无任何变化,即高水位线没有发生任何变化 Enter value for input_table_name: t Enter value for input_owner: scott NUM_ROWS BLKS EM_BLKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN AVG_ROWS_PER_BLOCK LST_ANLY STA ---------- ---------- ---------- ---------- ---------- ----------- ------------------ --------- --- 100 387 125 7921 0 262 0 03-NOV-11 NO SQL> set autotrace traceonly SQL> select count(*) from t; -->SQL的执行计划中预估的值准确,为100行 Execution Plan ---------------------------------------------------------- Plan hash value: 2966233522 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 86 (0)| 00:00:02 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T | 100 | 86 (0)| 00:00:02 | ------------------------------------------------------------------- Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 375 consistent gets -->consistent gets的值仍然为375,并没有下降 0 physical reads SQL> set autotrace off; SQL> alter table t enable row movement; -->启用row movement SQL> alter table t shrink space cascade; --> 实施shrink space SQL> alter table t disable row movement; SQL> exec dbms_stats.gather_table_stats('SCOTT','T'); SQL> analyze table t compute statistics; SQL> @Tab_Stat -->此时对象上的统计信息已发生变化,已使用的块为4块,空闲块为4块 Enter value for input_table_name: t Enter value for input_owner: scott NUM_ROWS BLKS EM_BLKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN AVG_ROWS_PER_BLOCK LST_ANLY STA ---------- ---------- ---------- ---------- ---------- ----------- ------------------ --------- --- 100 4 4 7921 0 259 25 03-NOV-11 NO SQL> set autotrace traceonly SQL> select count(*) from t; Execution Plan ---------------------------------------------------------- Plan hash value: 2966233522 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T | 100 | 3 (0)| 00:00:01 | ------------------------------------------------------------------- Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 6 consistent gets -->表段收缩之后,consistent gets由375下降为6 0 physical reads SQL> truncate table t; -->使用表截断技术(turncate table) Table truncated. SQL> exec dbms_stats.gather_table_stats('SCOTT','T'); -->收集统计信息 PL/SQL procedure successfully completed. SQL> select count(*) from t; -->此时执行计划中的rows变为1 Execution Plan ---------------------------------------------------------- Plan hash value: 2966233522 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T | 1 | 2 (0)| 00:00:01 | ------------------------------------------------------------------- Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 3 consistent gets -->consistent gets的值降为3 0 physical reads |