SQL> create table t5(id int);表已创建。SQL> insert into t5 values(1);已创建 1 行。SQL> insert into t5 values(2);已创建 1 行。SQL> insert into t5 values(3);已创建 1 行。SQL> insert into t5 values(4);已创建 1 行。SQL> commit;提交完成。SQL> exec dbms_stats.gather_table_stats('zch','T5');PL/SQL 过程已成功完成。SQL> select blocks from user_tables where table_name = 'T5';    BLOCKS                                                                      
----------                                                                      
         5                                                                      SQL> exec dbms_stats.gather_table_stats('zch','T5');PL/SQL 过程已成功完成。SQL> select blocks from user_tables where table_name = 'T5';    BLOCKS                                                                      
----------                                                                      
         5                                                                      SQL> create table t6 as select level id from dual connect by level < 5;表已创建。SQL> exec dbms_stats.gather_table_stats('zch','T6');PL/SQL 过程已成功完成。SQL> select blocks from user_tables where table_name = 'T6';    BLOCKS                                                                      
----------                                                                      
         4                                                                      SQL> create table t7(id int);表已创建。SQL> insert into t7 values(1);已创建 1 行。SQL> commit;提交完成。SQL> exec dbms_stats.gather_table_stats('zch','T7');PL/SQL 过程已成功完成。SQL> select blocks from user_tables where table_name = 'T7';    BLOCKS                                                                      
----------                                                                      
         5                                                                      我一共创建了三个表T5,T6,T7,然后插入数据,然后
使用select blocks from user_tables where table_name = '?'
结果确不一样,我想问问,这个blocks The number of used blocks in the table
应该是表使用的快,为什么会不一样,
oracle分配块的时候 和什么有关??

解决方案 »

  1.   

    oracle分配块是根据数据本身大小以及执行的数据操作。
      

  2.   

    能不能说说,我插入4条数据后,为什么会4个blocks还有就是,这个好像不是正确结果,
    因为 zjwssg 在他的机器上执行相同的操作,得到的结果是1block见
    http://topic.csdn.net/u/20100619/10/539e0ee0-df52-4e44-8430-d2fb1426b305.html请问大侠,是什么原因?
      

  3.   

    没有必要了解。要了解打开事件,跟踪SQL语句
      

  4.   

    SQL>  create table t5(id int);
    表已创建。
    SQL> insert into t5 values(1);
    已创建 1 行。
    SQL>  insert into t5 values(2);
    已创建 1 行。
    SQL>  insert into t5 values(3);
    已创建 1 行。
    SQL> insert into t5 values(4);
    已创建 1 行。
    SQL> commit;
    提交完成。
    SQL>  exec dbms_stats.gather_table_stats('SYS','T5');
    PL/SQL 过程已成功完成。
    SQL> select blocks,INITIAL_EXTENT from user_tables where table_name = 'T5';    BLOCKS INITIAL_EXTENT
    ---------- --------------
             1          65536BLOCKS* NUMBER Number of used data blocks in the table SQL> select segment_name,blocks,extents,bytes,segment_type,tablespace_name from
      2  dba_segments where segment_name='T5';SEGME     BLOCKS    EXTENTS      BYTES SEGMENT_TYPE       TABLESPACE_NAME
    ----- ---------- ---------- ---------- ------------------ ----------------------T5             8          1      65536 TABLE              SYSTEMBYTES NUMBER   Size, in bytes, of the segment 
    BLOCKS NUMBER   Size, in Oracle blocks, of the segment 
    EXTENTS NUMBER   Number of extents allocated to the segment 
    INITIAL_EXTENT NUMBER   Size in bytes requested for the initial extent of the segment at create time. (Oracle rounds the extent size to multiples of 5 blocks if the requested size is greater than 5 blocks.) 
    从dba_segments 表中查,显示的是8个块,64k的字节。 刚才插入的几个值,可能没有写满这些内容,在插入一点数据看一下。 
    SQL> begin
      2  for i in 1 .. 1000000 loop
      3  insert into T5 values(10000);
      4  commit;
      5  end loop;
      6  end;
      7  /这个时间太长了,只执行了一会。 在次查看。 
    SQL> select blocks,INITIAL_EXTENT from user_tables where table_name = 'T5';    BLOCKS INITIAL_EXTENT
    ---------- --------------
             1          65536SQL> 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              SYSTEM
    从这个结果来看, 从dba_segments 里查看的blocks 是准确的。 
    user_tables 里的blocks 可能是另一种含义. ------------------------------------------------------------------------------ 
    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
      

  5.   

    DBA_SEGMENTS.BLOCKS holds the total number of blocks allocated to the table. USER_TABLES.BLOCKS holds the total number of blocks allocated for data.
      

  6.   

    一般来说你把user_tables里面的blocks和empty_blocks相加会比dba_segments里的blocks少一个,这一个是segment header block...
      

  7.   


    从网上搜了点资料,研究了下:
    Dba_Segments .blocks=Dba_Tables.Blocks+Dba_Tables.Empty_Blocks 在执行查询之前,要先对表分析一下:
    analyze table T5 compute statistics;select blocks,empty_blocks from user_tables where table_name = 'T5';select segment_name,blocks,extents,bytes,segment_type,tablespace_name fromdba_segments where segment_name='T5';就像8楼所说的,DBA_TABLES的blocks+empty_blocks+1=DBA_SEGMENTS;
      

  8.   

    关于Dba_Segments .blocks和Dba_Tables.Blocks的区别,我大体理解了些,先谢谢!呵呵我还想知道,为什么我在我的机器上选择Dba_Tables.Blocks就是5个
    而你的就是1个,是为同样数据分配的数据块,怎么会不一样,
    我的oracle版本是10g  db_block_size 8K
      

  9.   

    而且,还有疑问!!
    SQL> conn sys/manager as sysdba
    已连接。
    SQL> create table t11 (id int);表已创建。SQL> insert into t11 values (1);已创建 1 行。SQL> commit;提交完成。SQL> exec dbms_stats.gather_table_stats('SYS','T11');PL/SQL 过程已成功完成。SQL> select blocks from user_tables where table_name ='T11';    BLOCKS                                                                      
    ----------                                                                      
             1                                                                      SQL> select blocks from user_segments where segment_name = 'T11';    BLOCKS                                                                      
    ----------                                                                      
             8                                                                      SQL> conn test/test@orcl
    已连接。
    SQL> create table t12(id int);表已创建。SQL> insert into t12 values(1);已创建 1 行。SQL> commit;提交完成。SQL> exec dbms_stats.gather_table_stats('TEST','T12');PL/SQL 过程已成功完成。SQL> select blocks from user_tables where table_name ='T12';    BLOCKS                                                                      
    ----------                                                                      
             5                                                                      SQL> select blocks from user_segments where segment_name = 'T12';    BLOCKS                                                                      
    ----------                                                                      
             8                                                                      SQL> spool off我用SYS用户创建了一个表,查看blocks是1
    用普通用户(只有connect,resource权限的用户),查看blocks确是5,各位大侠! 这是怎么回事??
      

  10.   


    用这个语句分析之后在看一下结果:analyze table T5 compute statistics;
      

  11.   


    SQL> conn sys/manager as sysdba
    已连接。
    SQL> create table t (id int);表已创建。SQL> insert into t values (1);已创建 1 行。SQL> analyze table t compute statistics;表已分析。SQL> select blocks from user_tables where table_name = 'T';    BLOCKS                                                                      
    ----------                                                                      
             1                                                                      SQL> select blocks from user_segments where segment_name='T';    BLOCKS                                                                      
    ----------                                                                      
             8                                                                      SQL> conn test/test@orcl
    已连接。
    SQL> create table t(id int);表已创建。SQL> insert into t values(1);已创建 1 行。SQL> commit;提交完成。SQL> analyze table test.t compute statistics;表已分析。SQL> select blocks from user_tables where table_name = 'T';    BLOCKS                                                                      
    ----------                                                                      
             5                                                                      SQL> select blocks from user_segments where segment_name='T';    BLOCKS                                                                      
    ----------                                                                      
             8                                                                      
    还是一样的结果,,是不是system表空间和users表空间内部的原因啊??
      

  12.   

    继续关注....   学习了.期待zhangcunhua问题,很长见识.