Oracle分区交换
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,从Oracle8开始,提供了从分区交换的功能,如一个分区或子分区与一个非分区表交换、一个hash分区与另一个表的hash子分区交换等等,详细的交换方式可以参考官方文档。基本语法:ALTER TABLE
千家信息网最后更新 2026年11月01日Oracle分区交换
从Oracle8开始,提供了从分区交换的功能,如一个分区或子分区与一个非分区表交换、一个hash分区与另一个表的hash子分区交换等等,详细的交换方式可以参考官方文档。
基本语法:ALTER TABLE...EXCHANGE PARTITION
实验环境:11.2.0.4
zx@ORCL>select * from v$version;BANNER------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionPL/SQL Release 11.2.0.4.0 - ProductionCORE 11.2.0.4.0 ProductionTNS for Linux: Version 11.2.0.4.0 - ProductionNLSRTL Version 11.2.0.4.0 - Production
一、测试分区交换
创建测试表
--分区表zx@ORCL>create table t1 2 ( id number(2), 3 name varchar2(15)) 4 tablespace tt 5 partition by range (id) 6 (partition p1 values less than (10), 7 partition p2 values less than (20), 8 partition p3 values less than (30));Table created.--非分区表zx@ORCL>create table t2 (id number(2), name varchar2(15)) tablespace users;Table created.--插入测试数据zx@ORCL>insert into t1 values (1, '1');1 row created.zx@ORCL>insert into t1 values (11, '11');1 row created.zx@ORCL>insert into t1 values (21, '21');1 row created.zx@ORCL>insert into t2 values (2, '2');1 row created.zx@ORCL>commit;Commit complete.zx@ORCL>select * from t1; ID NAME---------- --------------------------------------------- 1 1 11 11 21 21zx@ORCL>select * from t2; ID NAME---------- --------------------------------------------- 2 2--查看表存储表空间--t2在USERS表空间,t1各个分区都在TT表空间zx@ORCL>col segment_name for a20zx@ORCL>col partition_name for a15zx@ORCL>col tablespace_name for a15zx@ORCL>select segment_name,partition_name,tablespace_name from dba_segments where segment_name in ('T1','T2');SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME-------------------- --------------- ---------------T2 USERST1 P3 TTT1 P2 TTT1 P1 TT--查看各表的extent信息zx@ORCL>select SEGMENT_NAME,BLOCK_ID,BLOCKS,TABLESPACE_NAME from dba_extents where segment_name='T2';SEGMENT_NAME BLOCK_ID BLOCKS TABLESPACE_NAME-------------------- ---------- ---------- ---------------T2 192 8 USERSzx@ORCL>select SEGMENT_NAME,PARTITION_NAME,BLOCK_ID,BLOCKS,TABLESPACE_NAME from dba_extents where segment_name='T1';SEGMENT_NAME PARTITION_NAME BLOCK_ID BLOCKS TABLESPACE_NAME-------------------- --------------- ---------- ---------- ---------------T1 P2 21376 1024 TTT1 P3 22400 1024 TTT1 P1 20352 1024 TTt1分区p1与t2表交换分区
--分区zx@ORCL>alter table t1 exchange partition p1 with table t2;Table altered.zx@ORCL>select * from t2; ID NAME---------- --------------------------------------------- 1 1zx@ORCL>select * from t1; ID NAME---------- --------------------------------------------- 2 2 11 11 21 21
可以看到p1分区里的数据交换到了t2表里,而t2表里里的数据也存储到了t1表中。再次查看各表所在的表空间和extent
--查看表空间zx@ORCL>select segment_name,partition_name,tablespace_name from dba_segments where segment_name in ('T1','T2');SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME-------------------- --------------- ---------------T2 TTT1 P3 TTT1 P2 TTT1 P1 USERS--查看extentzx@ORCL>select SEGMENT_NAME,BLOCK_ID,BLOCKS,TABLESPACE_NAME from dba_extents where segment_name='T2';SEGMENT_NAME BLOCK_ID BLOCKS TABLESPACE_NAME-------------------- ---------- ---------- ---------------T2 20352 1024 TTzx@ORCL>select SEGMENT_NAME,PARTITION_NAME,BLOCK_ID,BLOCKS,TABLESPACE_NAME from dba_extents where segment_name='T1';SEGMENT_NAME PARTITION_NAME BLOCK_ID BLOCKS TABLESPACE_NAME-------------------- --------------- ---------- ---------- ---------------T1 P1 192 8 USERST1 P2 21376 1024 TTT1 P3 22400 1024 TT从结果看到T2已经到了TT表空间,而T1的P1分区移动到了USERS表空间,而且P1分区与T2表的extent也做了交换,可以推断实际表里的数据没有移动位置,只是把数据字典里的相关信息做了更换。
二、再看看交换分区对于分区表的索引的影响
在分区表中创建索引
--全局索引zx@ORCL>create index idx_t1_id on t1(id) ;Index created.--分区索引zx@ORCL>create index idx_t1_name on t1(name) local;Index created.zx@ORCL>select index_name,status from user_indexes where index_name like 'IDX_T1%';INDEX_NAME STATUS------------------------------------------------------------------------------------------ ------------------------IDX_T1_ID VALIDIDX_T1_NAME N/Azx@ORCL>select index_name,partition_name,status from user_ind_partitions where index_name like 'IDX_T1%';INDEX_NAME PARTITION_NAME STATUS------------------------------------------------------------------------------------------ --------------- ------------------------IDX_T1_NAME P1 USABLEIDX_T1_NAME P2 USABLEIDX_T1_NAME P3 USABLE
交换分区查看是否对索引有影响
zx@ORCL>alter table t1 exchange partition p1 with table t2;Table altered.zx@ORCL>select index_name,status from user_indexes where index_name like 'IDX_T1%';INDEX_NAME STATUS------------------------------------------------------------------------------------------ ------------------------IDX_T1_NAME N/AIDX_T1_ID UNUSABLEzx@ORCL>select index_name,partition_name,status from user_ind_partitions where index_name like 'IDX_T1%';INDEX_NAME PARTITION_NAME STATUS------------------------------------------------------------------------------------------ --------------- ------------------------IDX_T1_NAME P1 UNUSABLEIDX_T1_NAME P2 USABLEIDX_T1_NAME P3 USABLE
看到全局索引IDX_T1_ID失效了,分区P1对应的分区索引也失效了,但其他分区的分区没有受到影响
交换分区时加入 UPDATE INDEXES子句
zx@ORCL>alter index idx_t1_id rebuild;Index altered.zx@ORCL>alter index idx_t1_name rebuild partition p1;Index altered.zx@ORCL>select index_name,status from user_indexes where index_name like 'IDX_T1%';INDEX_NAME STATUS------------------------------------------------------------------------------------------ ------------------------IDX_T1_NAME N/AIDX_T1_ID VALIDzx@ORCL>select index_name,partition_name,status from user_ind_partitions where index_name like 'IDX_T1%';INDEX_NAME PARTITION_NAME STATUS------------------------------------------------------------------------------------------ --------------- ------------------------IDX_T1_NAME P1 USABLEIDX_T1_NAME P2 USABLEIDX_T1_NAME P3 USABLEzx@ORCL>alter table t1 exchange partition p1 with table t2 update indexes ;Table altered.zx@ORCL>select index_name,status from user_indexes where index_name like 'IDX_T1%';INDEX_NAME STATUS------------------------------------------------------------------------------------------ ------------------------IDX_T1_NAME N/AIDX_T1_ID VALIDzx@ORCL>select index_name,partition_name,status from user_ind_partitions where index_name like 'IDX_T1%';INDEX_NAME PARTITION_NAME STATUS------------------------------------------------------------------------------------------ --------------- ------------------------IDX_T1_NAME P1 UNUSABLEIDX_T1_NAME P2 USABLEIDX_T1_NAME P3 USABLE
可以看到全局索引没有受影响,但是分区索引仍然失效。
更多信息参考官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin002.htm#i1107555
索引
空间
数据
影响
信息
全局
表里
分区表
测试
官方
文档
参考
存储
移动
位置
再次
功能
只是
子句
字典
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技图片
天津市摩尔互联网科技
新华互联网科技学校
互联网科技深圳
互联网 科技
金融科技 互联网金融
易互联网科技有限公司
壕鑫互联网络科技
时间互联网络科技
狮子座互联网科技培训
互联网教育科技公司vipkid
栖莱科技互联网股份有限公司
工业互联网展湾科技股份有限公司
深圳互联网科技的发展
城市宝互联网科技有限公司
厦门江牛科技互联网
广州有谷有贝互联网科技有限公司
互联网科技企业商标注意事项
三亚科技创新互联网基地
科技互联网企业在行动
互联网佳科技有限公司
中关村互联网科技集团
科技金融是不是互联网金融
互联网科技网站
互联网金融监管科技
银川新华互联网科技职业技术培训学校图片
互联网经济与金融科技
保险科技服务互联网营销体系
科技信息时代互联网发展
互联网的科技体现在哪里