对于一个表T2,想知道其中包含了多少个 blocks,用了两种方法,得到的结果却不一样,SQL> select  u.table_name,  u.blocks,  u.num_rows from user_tables u where u.table_name='T2';
 
TABLE_NAME                         BLOCKS   NUM_ROWS
------------------------------ ---------- ----------
T2                                    305      20001
 
SQL> select  sum(blocks) from user_segments u where u.segment_name='T2';
 
SUM(BLOCKS)
-----------
        384哪一个语句得到的是正确的呢? 为什么呢?非常谢谢大家啊。

解决方案 »

  1.   


    楼主没有分析表:
    analyze table T2 compute statistics;分析之后在查看
    select blocks,empty_blocks from user_tables where table_name = 'T2';select segment_name,blocks,extents,bytes,segment_type,tablespace_name from dba_segments where segment_name='T2';DBA_TABLES的blocks+empty_blocks+1=DBA_SEGMENTS;这个加的1 是segment header block.
    SQL> select segment_name,blocks,extents,bytes,segment_type,tablespace_name from
    dba_segments where segment_name='T5';SEGME     BLOCKS    EXTENTS      BYTES SEGMENT_TYPE       TABLESPACE_NAME
    ----- ---------- ---------- ---------- ------------------ ----------------------T5          6528         66   53477376 TABLE              SYSTEMSQL> select blocks,empty_blocks from user_tables where table_name = 'T5';    BLOCKS EMPTY_BLOCKS
    ---------- ------------
          6449           78
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    DBA1 群:62697716(满); DBA2 群:62697977
      

  2.   

    补充一下,user_segments表中的blocks等于user_tables中的blocks和empty_blocks之和再加一,对于小表可能不存在这个1,而大表一般都相差1,这是因为有一个header block的缘故。
      

  3.   


    网上查了下 确实user_segments 中的blocks为user_tables中的blocks加上empty_blocks
    SQL> select blocks,empty_blocks from user_tables where table_name=upper('xs');    BLOCKS EMPTY_BLOCKS
    ---------- ------------
             5            3SQL> select blocks from user_segments where segment_name=upper('xs');    BLOCKS
    ----------
             8
      

  4.   


    查询之前还要对表进行分析
    analyze table tbname compute statistics
      

  5.   

    楼主没有分析表:
    analyze table T2 compute statistics;分析之后在查看
    select blocks,empty_blocks from user_tables where table_name = 'T2';select segment_name,blocks,extents,bytes,segment_type,tablespace_name from dba_segments where segment_name='T2';DBA_TABLES的blocks+empty_blocks+1=DBA_SEGMENTS;这个加的1 是segment header block.