日期:2014-05-16  浏览次数:20666 次

数据块的使用
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

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