dba_tables和dba_segments里记录的表大小的比较

  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里记录的表的大小的信息是实时的信息

你可能感兴趣的:(oracle维护经验)