普通ALTER TABLE MOVE TABLESPACE对LOB无效,因仅移动主表段,不处理独立的LOBSEGMENT和LOBINDEX;必须用ALTER TABLE ... MOVE LOB显式指定列名及TABLESPACE,否则LOB仍驻原表空间。
直接迁移lob段必须用 alter table ... move lob,不能只靠普通 move tablespace;否则lob数据和索引仍留在原表空间,白忙一场。
ALTER TABLE ... MOVE TABLESPACE 对LOB无效Oracle为每个LOB字段自动创建两个独立segment:LOBSEGMENT(存实际数据)和 LOBINDEX(加速定位)。普通 MOVE TABLESPACE 只移动主表段(TABLE 类型),完全不碰这两个LOB相关segment。执行后查 DBA_SEGMENTS 就会发现 SEGMENT_TYPE 为 LOBSEGMENT 和 LOBINDEX 的记录 TABLESPACE_NAME 没变——这是最常被忽略的“假成功”现象。
ALTER TABLE ... MOVE LOB 的正确写法与参数要点必须显式列出LOB列名,并指定目标表空间。语法核心是:ALTER TABLE owner.table_name MOVE TABLESPACE tbs_new LOB (col1, col2) STORE AS (TABLESPACE tbs_new);
CLOB/BLOB),大小写敏感,且不能加引号STORE AS (TABLESPACE ...) 是必需的,漏掉就等于没迁LOBLOBSEGMENT 和 LOBINDEX,无需单独处理索引段主表MOVE和LOB MOVE都不会影响普通B树索引的位置或可用性——它们仍指向旧表空间。查 ALL_INDEXES 会看到 STATUS 变成 UNUSABLE,查询报错 ORA-01502: index ... or partition of such index is in unusable state。
ALTER INDEX owner.index_name REBUILD TABLESPACE tbs_new;
REBUILD ONLINE:LOB迁移本身已锁表,再加ONLINE反而可能延长等待DBA_INDEXES 过滤 TABLESPACE_NAME = 'OLD_TBS' 且 OWNER 匹配单纯把LOB挪到另一个表空间还不够。真正起效的是让LOB段物理上远离高IO的业务表空间,避免磁盘争抢。尤其当LOB平均尺寸 >4KB 时,Oracle默认启用 DISABLE STORAGE IN ROW,所有读写都走独立LOB segment,这时IO路径和缓存行为完全不同。
ORA-01652
V$LOBSTAT 和 V$SESSION_LONGOPS,确认迁移后LOB访问延迟是否下降DBA_LOBS 视图里的 CHUNKSIZE 和 PCTVERSION:大块读取场景下,增大 CHUNKSIZE(如从8K调到32K)能减少IO次数最容易被跳过的其实是 LOBINDEX 的重建验证——它没有 STATUS 字段,只能靠 DBA_SEGMENTS 确认位置,或用 ANALYZE TABLE ... VALIDATE STRUCTURE CASCADE 抽样检查索引一致性。