Oracle 的 MOVE 操作是否重建表?

Oracle 的 MOVE 操作是否重建表?

Oracle 的 ALTER TABLE ... MOVE 操作实质上是重建表的物理存储结构,但保留表的逻辑定义不变。

MOVE 操作的本质

  1. 物理重建:

    • 创建新的数据段(物理存储结构)
    • 将原表数据按顺序重新插入到新段中
    • 删除原数据段
    • 更新数据字典指向新段
  2. 逻辑不变:

    • 表名、列定义、约束等逻辑结构保持不变
    • 表的对象ID(OBJECT_ID)会发生变化
    • 依赖对象(如视图、同义词)不受影响

重建的具体表现

  1. 数据重组 :

    sql 复制代码
    -- 执行前数据块状态
    SELECT extent_id, block_id, blocks 
    FROM dba_extents 
    WHERE segment_name = 'YOUR_TABLE';
    
    -- 执行MOVE
    ALTER TABLE your_table MOVE;
    
    -- 执行后数据块状态(完全改变)

输出示例:

sql 复制代码
SQL> SELECT extent_id, block_id, blocks FROM dba_extents WHERE segment_name = 'T1' and OWNER='TEST';

 EXTENT_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
         0       2496          8
         1       4696          8
         2       4704          8
         3       4712          8
         4       4720          8
         5       4728          8
         6       6016          8
         7       6024          8
         8       6032          8
         9       6040          8
        10       6048          8
        11       6056          8
        12       6064          8
        13       6072          8
        14       6080          8
        15       6088          8
        16       6272        128
        17       6400        128
        18       6528        128
        19       6656        128
        20       6784        128
        21       6912        128
        22       7040        128
        23       7168        128
        24       7296        128
        25       7424        128
        26       7552        128

27 rows selected.

SQL> ALTER TABLE t1 MOVE;

Table altered.

SQL> SELECT extent_id, block_id, blocks FROM dba_extents WHERE segment_name = 'T1' and OWNER='TEST';

 EXTENT_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
         0      10080          8
         1      10088          8
         2      10096          8
         3      10104          8
         4      10240          8
         5      10248          8
         6      10256          8
         7      10264          8
         8      10272          8
         9      10280          8
        10      10288          8
        11      10296          8
        12      10304          8
        13      10312          8
        14      10320          8
        15      10328          8
        16      10368        128
        17      10496        128
        18      10624        128
        19      10752        128
        20      10880        128
        21      11008        128
        22      11136        128
        23      14336        128
        24      14464        128
        25      14592        128
        26      14720        128

27 rows selected.
  1. DATA_OBJECT_ID变化 :

    sql 复制代码
    -- 执行前

select object_id,data_object_id,object_name,to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects where object_name = 'T1' and owner='TEST' ;

-- 执行后(新DATA_OBJECT_ID)

复制代码
输出示例:

```sql
SQL> select object_id,data_object_id ,object_name,to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects where object_name = 'T1' and owner='TEST' ;

OBJECT_ID DATA_OBJECT_ID OBJECT_NAME     CREATED
---------- -------------- --------------- -------------------
  75061          75870 T1              2025-02-04 23:15:05

SQL> ALTER TABLE t1 MOVE;

Table altered.

SQL> select object_id,data_object_id ,object_name,to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects where object_name = 'T1' and owner='TEST' ;

OBJECT_ID DATA_OBJECT_ID OBJECT_NAME     CREATED
---------- -------------- --------------- -------------------
  75061          75871 T1              2025-02-04 23:15:05
  1. ROWID变化 :
    • 所有行的ROWID都会改变
    • 基于ROWID的应用程序需要调整

与真正"重建表"的区别

特性 MOVE操作 完全重建表(CREATE AS SELECT)
表定义 保留所有属性 需要手动重建约束、触发器等
对象依赖关系 自动保持 需要手动重建
权限 保留原有权限 需要重新授权
执行速度 较快 较慢
高水位线重置 完全重置 完全重置
索引状态 需要重建 需要重建

需要特别注意的影响

  1. 索引处理:

    sql 复制代码
    -- MOVE后必须重建索引
    ALTER INDEX your_index REBUILD;
  2. 依赖对象:

    • 物化视图日志会被清除
    • 基于ROWID的物化视图需要刷新
    • 某些类型的约束可能需要重新验证
  3. 在线操作限制:

    sql 复制代码
    -- 12C开始支持有限制的在线MOVE
    ALTER TABLE your_table MOVE ONLINE;
    -- 但仍有部分锁限制,可能阻塞DML

何时应该使用MOVE

  1. 典型场景:

    • 表碎片化严重(超过30%空闲空间)
    • 需要迁移到其他表空间
    • 需要改变存储参数(如压缩)
    • 高水位线远高于实际数据位置
  2. 替代方案比较:

    • 对于小型表:CREATE TABLE new_table AS SELECT * FROM old_table
    • 对于最小化停机:DBMS_REDEFINITION在线重定义
    • 对于部分优化:SHRINK SPACE(不改变ROWID)

MOVE操作是Oracle提供的一种高效的"表重建"机制,它在保持逻辑结构不变的前提下,完全重建表的物理存储结构,是维护Oracle数据库性能的重要工具。

相关推荐
海宇AI5 小时前
零信任架构实战:基于海宇车辆车五项信息核验构建自动化汽配供应链车型分类与发动机型号适配网关
运维·人工智能·架构·自动化
程序员-Benothing5 小时前
Linux端口与连接排查:ss、lsof、nc、telnet、curl
linux·运维·服务器
看浪的路人6 小时前
第8讲:记忆系统的监控与运维——Prometheus 指标、Grafana 面板与告警体系
运维·grafana·prometheus
dishugj6 小时前
https://blog.csdn.net/dishugj/article/details/162068579
数据库·系统架构
java_logo6 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
运维·docker·容器·定时任务·青龙面板·轩辕镜像·qinglong
时间售卖铺6 小时前
MySQL 安装部署
运维·数据库·mysql·云原生
亚川楼宇自控系统数据中心厂家6 小时前
消防风机一体化监控系统结合楼宇自控 协同管控原理科普
运维
泡海椒6 小时前
JQuick-SQL 子查询:WHERE、SELECT、HAVING 与派生表实践
数据库·sql
邪修king6 小时前
Re:Linux系统篇(三十七):进程间通信Chapter4:System V 共享内存深度解析:为什么它是最快的 IPC?
android·linux·运维
用户0510122572966 小时前
SQLite 学习博客(一):从零建库,理解 SQLite 的角色与第一张表
数据库·sqlite