块空间管理
空间管理包括块级别的空闲空间管理。使用“自动段空间管理”时,每个块分为四部分,
分别称为FS1(空闲空间介于0 到25% 之间)、FS2(25% 到50% 空闲)、FS3(50% 到
75% 空闲)和FS4(75% 到100% 空闲)。
块的状态将根据其中空闲空间的级别自动更新。这样,您就可以根据所插入行的长度来判
断特定块能否满足插入操作的要求。请注意,“满”状态表示不能再向块中插入。
在幻灯片示例中,左侧的块是一个FS3 块,因为其空闲空间介于50% 和75% 之间。执行
了一些插入和更新语句后,将达到PCTFREE(虚线处),并且不能再向该块中插入新行。
现在该块被视为“满”或FS1 块。块的空闲空间级别一旦降至低于下一部分,就会考虑
将该块再次用于插入。在上面这种情况中,空闲空间一旦超过25%,状态即变为FS2。
注:大对象(LOB) 数据类型(BLOB、CLOB、NCLOB 和BFILE)不使用PCTFREE 存储
参数。未压缩块和OLTP 压缩块的默认PCTFREE 值为10;基本压缩块的默认PCTFREE
值为0。
行链接和行迁移
在以下两种情况下,表中某行的数据可能太大,无法包含在单个数据块中。第一种情况:
在第一次插入行时,就发现行太大,无法包含在一个数据块中。在这种情况下,Oracle DB
Server 将在为该段保留的一系列数据块(一个或多个)中存储该行的数据。较大的行通常
要进行行链接,例如包含数据类型为LONG 或LONG RAW 的列的行。在这些情况下,行链
接是无法避免的。
但在第二种情况中,最初可以包含在一个数据块中的行在更新后,整个行的长度增加了,
而块的空闲空间已经完全填满。在这种情况下,Oracle DB Server 假定整个行可以包含在新
数据块中,从而将整个行的数据迁移到新数据块中。数据库将保留迁移行的原始行片段,
以便指向包含迁移行的新块。迁移行的ROWID 不变。
当行链接或迁移后,与此行关联的输入/输出(I/O) 性能会降低,因为Oracle DB Server 必须
扫描多个数据块来检索该行的信息。
“段指导”查找包含由UPDATE 操作产生的迁移行的段。
Oracle DB 在以下情况下会以自动透明方式合并数据块的空闲空间:
• INSERT 或UPDATE 语句尝试使用包含足够空闲空间的块来容纳新的行片段
• 空闲空间已成为碎片,以致于行片段无法插入到块的相邻部分
合并之后,空闲空间量与操作前的空间量相同,但空间现在是连续的。
收缩对象段
1.启动行移动
ALTER TABLE employees ENABLE ROW MOVEMENT;
2.收缩表
ALTER TABLE employees SHRINK SPACE CASCADE;
alter table t2 shrink space compact;整理段不回收空间
3.lob 数据收缩
ALTER TABLE employees MODIFY LOB(resume) (SHRINK
SPACE);
4.禁用行移动
ALTER TABLE employees disable ROW MOVEMENT;
2.针对单个表的空间使用分析
ANALYZE TABLE fixf_pub_zlxz COMPUTE STATISTICS;
select * from user_tables where table_name= UPPER('fixf_pub_zlxz');查看分析结果
3.段分配管理
1.建表时段分配管理
create table t1(id NUMBER(4)) SEGMENT CREATION DEFERRED; 延时分配段
create table t1(id NUMBER(4)) SEGMENT CREATION IMMEDIATE; 立即分配
2.修改系统默认段分配管理
alter session set deferred_segment_creation = true;
alter system set deferred_segment_creation = false;
3.创建没有段的索引
create index idx_id on t(id) unusable;
4.修改索引的段分配机制
alter index idx_id unusable;
alter index idx_id rebuild;