数据块的使用
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块的介绍。
------解决方案--------------------最后一句说错了,不是防止块迁移是防止行迁移,不好意思