11G数据库,以scott用户所拥有的表为例
--1.先查看这两个表
SQL> select table_name, num_rows, avg_row_len, blocks, blocks from dba_tables where owner='SCOTT';
TABLE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS BLOCKS
--------------- ---------- ----------- ---------- ----------
DEPT 4 20 5 5
EMP 14 38 5 5
SALGRADE 5 10 5 5
BONUS 0 0 0 0 --这个表里面没有记录,dba_tables记下了这个表
SQL> select segment_name, blocks, bytes from dba_segments where owner='SCOTT' and segment_type='TABLE';
SEGMENT_NAME BLOCKS BYTES
--------------- ---------- ----------
DEPT 8 65536
EMP 8 65536
SALGRADE 8 65536
--BONUS表没记录,没有占用物理空间,dba_segments没有关于这个表的记录
--2.创建一个没有记录的空表,再查看这两个表
SQL> create table test as select * from all_objects where 0=1;
create table 成功。
SQL> select count(*) from test;
COUNT(*)
----------------------
0
1 rows selected
SQL> select table_name, num_rows, avg_row_len, blocks, blocks from dba_tables where owner='SCOTT';
TABLE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS BLOCKS
--------------- ---------- ----------- ---------- ----------
DEPT 4 20 5 5
EMP 14 38 5 5
SALGRADE 5 10 5 5
TEST --记录了test表,但是没有详细信息
BONUS 0 0 0 0
SQL> select segment_name, blocks, bytes from dba_segments where owner='SCOTT' and segment_type='TABLE';
SEGMENT_NAME BLOCKS BYTES
--------------- ---------- ----------
DEPT 8 65536
EMP 8 65536
SALGRADE 8 65536
--test表没有占用物理空间,还是没有记录这个表
--3.插入数据,再查看这两个表
SQL> insert into test select * from all_objects;
65665 行 已插入
SQL> select table_name, num_rows, avg_row_len, blocks, blocks from dba_tables where owner='SCOTT';
TABLE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS BLOCKS
--------------- ---------- ----------- ---------- ----------
DEPT 4 20 5 5
EMP 14 38 5 5
SALGRADE 5 10 5 5
TEST --test表,还是没有详细信息
BONUS 0 0 0 0
SQL> select segment_name, blocks, bytes from dba_segments where owner='SCOTT' and segment_type='TABLE';
SEGMENT_NAME BLOCKS BYTES
--------------- ---------- ----------
DEPT 8 65536
EMP 8 65536
SALGRADE 8 65536
TEST 1024 8388608 --记录了test表,且记录了占用物理空间的大小
--4.收集scott用户的统计信息,再查看这两个表
SQL> exec dbms_stats.gather_schema_stats(ownname => 'scott',cascade => true,estimate_percent => dbms_stats.auto_sample_size);
PL/SQL procedure successfully completed
SQL> select table_name, num_rows, avg_row_len, blocks, blocks from dba_tables where owner='SCOTT';
TABLE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS BLOCKS
--------------- ---------- ----------- ---------- ----------
DEPT 4 20 5 5
EMP 14 38 5 5
SALGRADE 5 10 5 5
TEST 0 0 1000 1000 --test表有了详细的信息,但是信息明显不对 ??? 难道收集的方式不对
BONUS 0 0 0 0
SQL> select segment_name, blocks, bytes from dba_segments where owner='SCOTT' and segment_type='TABLE';
SEGMENT_NAME BLOCKS BYTES
--------------- ---------- ----------
DEPT 8 65536
EMP 8 65536
SALGRADE 8 65536
TEST 1024 8388608
结论:dba_segments里记录的表的大小的信息是实时的信息
本文探讨了dba_tables与dba_segments视图中关于表大小信息的差异,重点指出dba_segments提供的数据是实时更新的。
263

被折叠的 条评论
为什么被折叠?



