从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 Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

一、测试分区交换

创建测试表

--分区表
zx@ORCL>create table t12  ( id number(2),3  name varchar2(15))4  tablespace tt5  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 111 1121 21zx@ORCL>select * from t2;ID NAME
---------- ---------------------------------------------2 2
--查看表存储表空间
--t2在USERS表空间,t1各个分区都在TT表空间
zx@ORCL>col segment_name for a20
zx@ORCL>col partition_name for a15
zx@ORCL>col tablespace_name for a15
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                                   USERS
T1                   P3              TT
T1                   P2              TT
T1                   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 TT
T1                   P3                   22400       1024 TT
T1                   P1                   20352       1024 TT

t1分区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 211 1121 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                                   TT
T1                   P3              TT
T1                   P2              TT
T1                   P1              USERS
--查看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                        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 USERS
T1                   P2                   21376       1024 TT
T1                   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                                                                                  VALID
IDX_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              USABLE
IDX_T1_NAME                                                                                P2              USABLE
IDX_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/A
IDX_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              UNUSABLE
IDX_T1_NAME                                                                                P2              USABLE
IDX_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/A
IDX_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              USABLE
IDX_T1_NAME                                                                                P2              USABLE
IDX_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/A
IDX_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              UNUSABLE
IDX_T1_NAME                                                                                P2              USABLE
IDX_T1_NAME                                                                                P3              USABLE

可以看到全局索引没有受影响,但是分区索引仍然失效。

更多信息参考官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin002.htm#i1107555

转载于:https://blog.51cto.com/hbxztc/1892937

Oracle分区交换相关推荐

  1. oracle分区交换有啥好处,分区交换的速度为什么快?

    Oracle的分区交换功能,用来实现对数据"滑动窗口"操作,就是可以把数据从分区表中指定分区移出到一个表,或把一个表的数据移入到指定的分区中.[@more@] 分区交换的速度是非常 ...

  2. oracle交换分区转移数据,oracle 分区交换-归档数据

    交换分区的操作步骤如下: 1. 创建分区表t1,假设有2个分区,P1,P2. 2. 创建基表t11存放P1规则的数据. 3. 创建基表t12 存放P2规则的数据. 4. 用基表t11和分区表T1的P1 ...

  3. oracle分区交换速度,oracle交换分区对数据的加载提速案例

    author:skate time:2012/07/16 oracle交换分区对数据的加载提速案例 环境: os:linux db:oracle10g 其中一个库的数据加载非常慢,如何能提高数据的加载 ...

  4. oracle分区exchange,oracle 分区表exchange原理

    oracle分区的exchange操作非常快,那原理是什么呢?下面我们来做个实验: SQL> create table test (id number(3)); 表已创建. SQL> in ...

  5. Oracle分区技术特性详细解读

    老张拉呱:thomas zhang,甲骨文云平台事业部资深技术顾问,2008年加入甲骨文公司数据库咨询部门,10+年甲骨文解决方案咨询支持经验,资深系统工程师.Oracle OCM认证专家,具有丰富的 ...

  6. Oracle分区(Partition)

    项目中用到的partition,总结整理一下相关知识.(网上采集,如有侵权,请及时联系.)   一.Oracle分区简介 ORACLE的分区是一种处理超大型表.索引等的技术.分区是一种"分而 ...

  7. oracle分区注意点,ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项

    http://www.cnblogs.com/yumiko/p/6163523.html 前言: 本文着重总结分区表的日常维护操作以及相应的注意事项. 本文涉及的日常维护内容包括: 增加分区(add) ...

  8. linux 根目录分配多少好,Linux下硬盘怎么分区才合适:根分区(/)交换分区(/swap)和/boot分区需要多大...

    Linux下硬盘怎么分区才合适:根分区(/)交换分区(/swap)和/boot分区需要多大 : 在对硬盘进行分区前,应该先弄清楚计算机担负的工作及硬盘的容量有多大,还要考虑到以下几个问题. 第一点也是 ...

  9. 2如何看表分区字段_技术分享|Oracle分区技术的实现总结

    郝秉睿 青岛科技研发中心 相信对于分区技术,大家一定都有所了解.但是你知道Oracle一共有多少种分区技术么?它们的适用范围和规范是怎样?今天让我们一起来看一看Oracle分区技术的魅力. 在大型的数 ...

最新文章

  1. IO对象流(序列化和反序列化)
  2. 数据结构 2-3-3 循环链表
  3. 你不能访问此文件夹,因为你组织的安全策略阻止了未经身份验证的来宾访问
  4. iOS隐私权限的设置
  5. ubuntu16.04 kinect2 驱动和ROS驱动
  6. UVa 1586 Molar mass(模拟)
  7. 面积二次矩second moment of area 极惯性矩polar moment of area 转动惯量moment of inertia面积一次矩first moment of area
  8. 西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第22期目录
  9. 原生js快速查找指定元素
  10. H5 前端模板 JS 用法
  11. 上职高学计算机可以考师范大学吗,职业高中也可以考大学,你知道吗?
  12. 刘长炯 beansoft(myeclipse_java) 一个不错的作者
  13. python中应对各种机制
  14. php 判断是否微信访问,PHP判断是否微信访问的方法示例
  15. 如何删除pagefile.sys
  16. 【阿里云高校计划】视觉AI-身份证识别系统搭建
  17. 人机交互系统(2.1)——深度学习分布式计算框架
  18. 2048小游戏项目开发代码
  19. 2005年九大受宠技术:HSDPA
  20. 信息学奥赛一本通:1162:字符串逆序

热门文章

  1. cesium 加载Googl式的切片
  2. python 传奇服务端_传奇游戏服务器源码学习
  3. 苹果怎么删除通讯录联系人_苹果手机通讯录怎么恢复?这才是正确的打开方式!...
  4. 计算机图形学算法详解,计算机图形学裁剪算法详解
  5. sql 查询关联字段 最好取别名 不然会被第一个覆盖
  6. matlab求数的因子,matlab中因子分析的函数factoran如何使用??
  7. html代码怎么出歌词,html中的歌词翻译
  8. sap模块介绍_一分钟掌握SAP小知识-系统基本操作
  9. linux如何获取raw中的文件路径,如何使用Linux获得Touchscreen Rawdata的坐标
  10. 设计模式-软件设计七大原则