SQL> exec dbms_stats.gather_table_stats('LIJIAMAN','TEST01');
PL/SQL procedure successfully completed
收集统计信息后,我们对段进行分析,插入10000条数据,oracle一共分配了4个区,每个区包含8个数据块,每个数据块大小为8KB。此时,表的统计数据已经有了,但是表的Blocks与段的Blocks数量不同,这是什么引起的呢?通过查看两个blocks栏位的定义,可以看到:
dba_tables.blocks:该表已经使用的数据块的数量(Number of used data blocks in the table);
dba_segments.blocks:该段中数据块的总数(Size, in Oracle blocks, of the segment)。
也就是说还有4个数据块还未使用。
可以使用ANALYZE进行统计
SQL> analyze table TEST01 compute statistics; Table analyzed SQL> SQL> select 2 dt.table_name, 3 dt.blocks, 4 dt.empty_blocks 5 from 6 dba_tables dt 7 where 8 dt.table_name = 'TEST01'; TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ------------ TEST01 28 4
经过分析,dba_tables统计的数据块与dba_segments统计的数据块数量相同了。
此时的高水位线应该如下:
(3)删除test01里面的全部数据,重新统计信息,发现数据块并没有被回收释放。这些数据块(dba_tables.blocks=28)曾经拥有过数据,但是现在数据已被删除。
SQL> delete from test01; 10000 rows deleted SQL> commit; Commit complete SQL> analyze table test01 compute statistics; Table analyzed SQL> SQL> select 2 dt.table_name, 3 dt.blocks, 4 dt.empty_blocks 5 from 6 dba_tables dt 7 where 8 dt.table_name = 'TEST01'; TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ------------ TEST01 28 4 SQL> select 2 ds.segment_name, 3 ds.segment_type, 4 ds.header_file, 5 ds.header_block, 6 ds.bytes, 7 ds.blocks, 8 ds.extents 9 from 10 dba_segments ds 11 where 12 ds.segment_name = 'TEST01'; SEGMENT_NAME SEGMENT_TYPE HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS ------------- ------------------ ----------- ------------ ---------- ---------- ---------- TEST01 TABLE 6 162 262144 32 4
此时的高水位线应该如下: