SQL> create table t(x int primary key,y varchar2(4000));表已创建。SQL> insert into t(x,y)
  2  select rownum,rpad('*',149,'*') from dual
  3   connect by level <=46;已创建46行。SQL> commit;提交完成。SQL>  select length(y),dbms_rowid.rowid_block_number(rowid) blk,count(*),min(x),max(x) from t
  2   group by length(y),dbms_rowid.rowid_block_number(rowid); LENGTH(Y)        BLK   COUNT(*)     MIN(X)     MAX(X)
---------- ---------- ---------- ---------- ----------
       149         52          1         46         46
       149         56         45          1         45
我使用的块大小=8KB,那么为什么表t占用了2个数据块,应该算起来表t共有(1+149)*46=6900B,完全小于一个块8096B

解决方案 »

  1.   

    每个块都不是全部用来装数据的,块有块首,块尾,表目录,行目录这也也是要空间的啊,还有你创建表的时候会给每个块分配pctused和pctfree参数。
    pctfree也就是每个块的剩余空间,主要用来更新块里面的行,默认为10(也就是10%);
    pctused主要是块使用的空间,当低于这个参数时才允许向这个快插入数据,默认值是40;
    其实说白了,就是为了防止块迁移(一行数据存在两个块中)而会有些块空间是不能使用的,建议你多看看oracle块的介绍。