RECORDS_PER_BLOCK参数用于设定每个BLOCK中记录数的最大值,其先找到当前表所有BLOCK中容纳的最大行数,并会把这个数字记录到数据字典,以后任何导致BLOCK行数超过这个数字的插入都会被拒绝。
测试:(环境10.2.0.1.0 - 64bi)
create table test(id number,name varchar2(100));
BEGIN
FOR I IN 1 .. 1000 LOOP
INSERT INTO TEST VALUES (I, 'NAME' || I);
END LOOP;
COMMIT;
END;
/
SELECT dbms_rowid.rowid_block_number(ROWID),COUNT(0)
FROM test
GROUP BY dbms_rowid.rowid_block_number(ROWID);
BLOCK COUNT(0)
33411 427
33410 439
33412 134
可以看到在缺省情况下,每个BLOCK可以存放430条左右的记录。
将表重建,然后插入10条记录,之后先执行:
alter table test minimize records_per_block;
然后再插入100条记录,查看BLOCK的分步情况:
BLOCK COUNT(0)
33414 10
33411 10
(后面省略)
经过多次测试发现:执行alter table test minimize records_per_block;之后,目前BLOCK中的记录数(的最大值)会应用到以后的新增数据中,也就是,当以后再往表中INSERT数据时,每个BLOCK中可以包含的记录数将与设定records_per_block之前的最大值保持一致。
需要注意的是:
l 不能对空表设定此参数。
l 每个BLOCK中可以包含的记录数的最低下限是2。
l 不能在已经有 bitmap 的表中使用records_per_block参数,也就是说,如果要使用records_per_block参数,必须先alter table xxx minimize records_per_block,然后才能在表上建立索引。
主要用途:
l 通过减少同一个block中的记录数,使记录分布于更多的数据块中,可以优化等待块类型为data block的Buffer Busy Wait事件。
l 其主要用途是提高BITMAP INDEX的存储性能
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4555/viewspace-711742/ ,如需转载,请注明出处,否则将追究法律责任。