Oracle分区交换

从Oracle8开始,提供了从分区交换的功能,如一个分区或子分区与一个非分区表交换、一个hash分区与另一个表的hash子分区交换等等,详细的交换方式可以参考官方文档。

基本语法:ALTER TABLE...EXCHANGE PARTITION

实验环境:11.2.0.4

[email protected]>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

一、测试分区交换

创建测试表

--分区表
[email protected]>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.
--非分区表
[email protected]>create table t2 (id number(2), name varchar2(15)) tablespace users;

Table created.

--插入测试数据
[email protected]>insert into t1 values (1, ‘1‘);

1 row created.

[email protected]>insert into t1 values (11, ‘11‘);

1 row created.

[email protected]>insert into t1 values (21, ‘21‘);

1 row created.

[email protected]>insert into t2 values (2, ‘2‘);

1 row created.

[email protected]>commit;

Commit complete.

[email protected]>select * from t1;

        ID NAME
---------- ---------------------------------------------
         1 1
        11 11
        21 21

[email protected]>select * from t2;

        ID NAME
---------- ---------------------------------------------
         2 2
--查看表存储表空间
--t2在USERS表空间,t1各个分区都在TT表空间
[email protected]>col segment_name for a20
[email protected]>col partition_name for a15
[email protected]>col tablespace_name for a15
[email protected]>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信息
[email protected]>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 USERS

[email protected]>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表交换分区

--分区
[email protected]>alter table t1 exchange partition p1 with table t2;

Table altered.

[email protected]>select * from t2;

        ID NAME
---------- ---------------------------------------------
         1 1

[email protected]>select * from t1;

        ID NAME
---------- ---------------------------------------------
         2 2
        11 11
        21 21

可以看到p1分区里的数据交换到了t2表里,而t2表里里的数据也存储到了t1表中。再次查看各表所在的表空间和extent

--查看表空间
[email protected]>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
[email protected]>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 TT

[email protected]>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也做了交换,可以推断实际表里的数据没有移动位置,只是把数据字典里的相关信息做了更换。

二、再看看交换分区对于分区表的索引的影响

在分区表中创建索引

--全局索引
[email protected]>create index idx_t1_id on t1(id) ;

Index created.
--分区索引
[email protected]>create index idx_t1_name on t1(name) local;

Index created.

[email protected]>select index_name,status from user_indexes where index_name like ‘IDX_T1%‘;

INDEX_NAME                                                                                 STATUS
------------------------------------------------------------------------------------------ ------------------------
IDX_T1_ID                                                                                  VALID
IDX_T1_NAME                                                                                N/A

[email protected]>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

交换分区查看是否对索引有影响

[email protected]>alter table t1 exchange partition p1 with table t2;

Table altered.

[email protected]>select index_name,status from user_indexes where index_name like ‘IDX_T1%‘;

INDEX_NAME                                                                                 STATUS
------------------------------------------------------------------------------------------ ------------------------
IDX_T1_NAME                                                                                N/A
IDX_T1_ID                                                                                  UNUSABLE

[email protected]>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子句

[email protected]>alter index idx_t1_id rebuild;

Index altered.

[email protected]>alter index idx_t1_name rebuild partition p1;

Index altered.

[email protected]>select index_name,status from user_indexes where index_name like ‘IDX_T1%‘;

INDEX_NAME                                                                                 STATUS
------------------------------------------------------------------------------------------ ------------------------
IDX_T1_NAME                                                                                N/A
IDX_T1_ID                                                                                  VALID

[email protected]>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

[email protected]>alter table t1 exchange partition p1 with table t2 update indexes ;

Table altered.

[email protected]>select index_name,status from user_indexes where index_name like ‘IDX_T1%‘;

INDEX_NAME                                                                                 STATUS
------------------------------------------------------------------------------------------ ------------------------
IDX_T1_NAME                                                                                N/A
IDX_T1_ID                                                                                  VALID

[email protected]>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

时间: 2024-10-05 01:40:23

Oracle分区交换的相关文章

oracle 入门笔记---分区表的分区交换

本文参考来自作者:蓝紫 详细内容请阅读原文 : http://www.cnblogs.com/lanzi/archive/2013/01/24/2875838.html 在oracle 11.2环境下测试 --drop table tab_a purge; --创建分区表 create table tab_a ( r_id number(19) primary key, r_name varchar2(300), r_pat  integer ) partition by list (r_pat

Oracle用分区表分区交换做历史数据迁移

一. 说明: OLTP库中有些表数据量大,且每月有持续的大量数据添加.因为历史数据在此库中不再做訪问,而是在另1个OLAP库中做分析.所以会对历史数据迁移至OLAP库中.对这样的历史数据迁移的操作.较好的办法是该表採用分区表.按时间分区后,能够对分区进行迁移.通过分区交换和表空间传输会非常easy完毕.并且性能上影响非常小. 关于分区表很多其它内容:    http://blog.csdn.net/tanqingru/article/category/1397435 关于表空间传很多其它内容:

linux下安装Oracle时交换空间不足的解决方法

摘:linux下安装Oracle时交换空间不足的解决方法 linux上安装Oracle时交换空间不足的解决办法 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本文的第二种方法, 至于第一种方法应该是安装系统时设置交换区. 1.使用分区: 在安装OS时划分出专门的交换分区,空间大小要事先规划好,启动系统时自动进行mount. 这种方法只能在安装OS时设定,一旦设定好不容易改变,除非重装系统. 2.使用swapfile:(或者是整个空闲分区) 新建临时swap

用分区表分区交换做历史数据迁移

一.说明: OLTP库中有些表数据量大,且每月有持续的大量数据增加,由于历史数据在此库中不再做访问,而是在另1个OLAP库中做分析,所以会对历史数据迁移至OLAP库中.对这种历史数据迁移的操作,较好的办法是该表采用分区表.按时间分区后,可以对分区进行迁移.通过分区交换和表空间传输会很容易完成,而且性能上影响很小. 关于分区表更多内容:    http://blog.csdn.net/tanqingru/article/category/1397435 关于表空间传更多内容: http://blo

柯南君 :Oracle 分区技术 之 如何支撑大数据操作?

前段时间,看了罗女士( 资深技术顾问 - Oracle 中国 顾问咨询部)关于<大批量数据处理技术的演讲>视频,感觉受益良多,结合多年的知识积累,柯南君给大家分享一下: 交流内容: 一.Oracle的分区技术 (一)分区技术内容 1. 什么是分区? 分区就是将一个非常大的table或者index 按照某一列的值,分解为更小的,易于管理的逻辑片段---分区.将表或者索引分区不会影响SQL语句以及DML(见备注)语句,就和使用非分区表一样,每个分区拥有自己的segment(见备注),因为,DDL(

Oracle分区

目录 Oracle分区 0 一.Oracle分区理论知识 1 二.分区表的实现方式 1 1.范围分区(range partition table) 1 2.列表分区(list partitioning) 3 3.散列分区(hash partitioning) 4 4.间隔分区(interval partitioning) 5 5.引用分区(reference partitioning) 6 6.组合分区(composite partitioning) 7 7.行移动(row movement)

oracle分区提高篇

  一. 分区表理论知识 Oracle提供了分区技术以支持VLDB(Very Large DataBase).分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中.分区完全对应用透明. Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中.查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询. When to Partition a Table什么时候需要分区表,官网的2个建议如下: (1)Ta

Oracle 分区索引

分区索引(或索引分区)主要是针对分区表而言的.随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引.分区索引的好处是显而易见的.就是简单地把一个索引分成多个片断,在获取所需数据时,只需要访问更小的索引片断(块)即可实现.同时把分区放在不同的表空间可以提高分区的可用性和可靠性.本文主要描述了分区索引的相关特性并给出演示示例. 1.分区索引的相关概念a.分区索引的几种方式:表被分区而索引未被分区:表未被分区,而索引被分区:表和索引都被分区b.分区索引可以分为本地分区索引

oracle 分区和分区索引

一.个人理解:建表时一般都会指定在一个表空间上,但是可能随着表空间扩大,查询越来越慢,分区表就是将一个表实际存在不同的表空间,oracle存储分为块,断,表空间.新建一个表,会给表分配指定大小的段,段里包含存储块,高水位线就是指段空间被撑大了. 表空间和分区的区别: (1)表空间是逻辑存储单位,所有的表段放在表空间里.至于表的分区,也可看作一个逻辑段,属于比表空间小一级的逻辑存储单位. (2)他们根本不是一个概念,表空间是由多个数据文件组成的,可以这么说  块组成了段,段组成了表空间,表空间组成