段空间管理auto与manual的核心区别在于空闲块管理方式:auto使用位图自动标记块状态,忽略pctused/freelists等参数;manual依赖手工配置的freelists和pctused调度,高并发下易争用latch,且无法在线切换,需drop重建或move迁移。

段空间管理AUTO和MANUAL的核心区别在哪
区别不在“能不能用”,而在“谁来管空闲块”——AUTO用位图(bitmap)自动标记数据块的使用状态,MANUAL靠FREELISTS和PCTUSED等参数手工调度。前者省心、并发高、不易出错;后者需要精细调参,且在高并发DML下容易争用freelist头块,导致enq: TX - allocate ITL wait之类等待。
创建表空间时指定SEGMENT SPACE MANAGEMENT AUTO的实际效果
只要表空间是本地管理(EXTENT MANAGEMENT LOCAL),就可以用SEGMENT SPACE MANAGEMENT AUTO。启用后,建在该表空间里的所有对象(表、索引)自动忽略PCTUSED、FREELISTS、FREELIST GROUPS这些参数——哪怕你显式写了,Oracle也直接无视。
CREATE TABLESPACE tbs1 DATAFILE '/path/tbs1.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;- 如果建表时还写
STORAGE (FREELISTS 4),这条会被静默丢弃 - 查询
dba_tables里的freelists列会显示NULL,不是0也不是默认值 - 位图块(bitmap block)由Oracle内部维护,DBA不能直接查或干预
为什么MANUAL段管理现在基本不用了
不是语法废了,而是工程上不划算。Oracle 9i起就主推AUTO,到现在所有新安装库默认都是它。手动管理的问题很实在:
- 每个段必须配合适的
FREELISTS数,否则高并发插入时卡在freelist latch上 -
PCTUSED设低了空间浪费,设高了频繁触发block split和ITL争用 - 无法支持ASSM特有功能,比如
COMPRESS BASIC或ADVANCED压缩 - DBA要定期分析
dba_free_space和v$segment_statistics调参,成本远高于AUTO的“建完就跑”
切换段管理方式有没有办法
没有在线切换命令。表空间一旦创建,SEGMENT SPACE MANAGEMENT属性就固化了。想从MANUAL切到AUTO,只能:
- 新建一个
SEGMENT SPACE MANAGEMENT AUTO的表空间 - 用
ALTER TABLE ... MOVE TABLESPACE new_tbs迁移表(注意索引失效,需重建) - 索引同样要
ALTER INDEX ... REBUILD TABLESPACE new_tbs - 原表空间留作归档或DROP前确认无对象残留
特别注意:MOVE操作会锁表、产生大量redo,且期间原表不可DML——这不是配置变更,是物理重组。











