iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >oracle分区交换(exchange)技术
  • 787
分享到

oracle分区交换(exchange)技术

2024-04-02 19:04:59 787人浏览 泡泡鱼
摘要

需求:一个几亿条数据的分区表,要把一些老数据分出来,放一个新建的表上。按时间划分,指定时间以前的放在老数据表,指定时间以后的数据保留在原表,然后把备份老数据表空间truncate掉。按照分区操作分区交换

需求:一个几亿条数据的分区表,要把一些老数据分出来,放一个新建的表上。按时间划分,指定时间以前的放在老数据表,指定时间以后的数据保留在原表,然后把备份老数据表空间truncate掉。按照分区操作分区交换是最好的解决办法。

分区交换技术可以实现数据快速转移,所以在数据加载提速,历史数据清理等方面特别有用。分区交换技术实际上只修改了数据字典中的数据物理段位置,而不是实际的移动数据,所以速度很快。

创建分区表:
create table t_exchange
(
sno number not null primary key,
oitime date DEFAULT sysdate,
Word  varchar2(100)
)
PARTITioN BY range(sno)
( PARTITION p1 VALUES LESS THAN (10000) tablespace TBS_MING,
 PARTITION p2 VALUES LESS THAN (20000) tablespace TBS_MING,
 PARTITION p3 VALUES LESS THAN (maxvalue) tablespace TBS_MING
) tablespace TBS_MING;

历史分区表:
create table t_exchange_his
(
sno number not null primary key,
oitime date DEFAULT sysdate,
word  varchar2(100)
)
PARTITION BY range(sno)
( PARTITION p1 VALUES LESS THAN (10000) tablespace TBS_MING,
 PARTITION p2 VALUES LESS THAN (20000) tablespace TBS_MING,
 PARTITION p3 VALUES LESS THAN (maxvalue) tablespace TBS_MING
) tablespace TBS_MING;

插入数据:
begin
   for i in 1..30000 loop
     insert into t_exchange values(i,sysdate,lpad('mingshuo',100,'x'));
   end loop;
dbms_output.put_line('success!');
commit;
end; 
/

创建一些不同类型的索引,观察分区交换是不是会对索引产生影响:
源表:
创建全局分区索引:
create index t_exchange_idx_01 on t_exchange(sno,oitime,word)
GLOBAL  partition by  range(sno)
(
 partition p01 values less than(10000) tablespace TBS_MING,
 partition p02 values less than(20000) tablespace TBS_MING,
 partition p03 values less than(MAXVALUE) tablespace TBS_MING
);

创建本地非前缀索引:
create index t_exchange_idx_02 on t_exchange(word) local;

创建唯一索引:
create unique index t_exchange_idx_03 on t_exchange(sno,oitime);

历史表:
创建全局分区索引:
create index t_exchange_his_idx_01 on t_exchange_his(sno,oitime,word)
GLOBAL  partition by  range(sno)
(
 partition p01 values less than(10000) tablespace TBS_MING,
 partition p02 values less than(20000) tablespace TBS_MING,
 partition p03 values less than(MAXVALUE) tablespace TBS_MING
);

创建本地非前缀分区索引:
create index t_exchange__his_idx_02 on t_exchange_his(word) local;

源表与历史表的区别在于没有创建唯一索引。
创建中间表:
create table t_exchange_tmp as select * from t_exchange where 1=2; sql> !ora ddl ming table t_exchange_tmp
\n=============Fri Jun 22 19:31:13 CST 2018===================\n

Session altered. DBMS_METADATA.GET_DDL(UPPER('TABLE'),UPPER('T_EXCHANGE_TMP'),UPPER('MING'))
-------------------------------------------------------------------------------

 CREATE TABLE "MING"."T_EXCHANGE_TMP"
  (    "SNO" NUMBER NOT NULL ENABLE,
       "OITIME" DATE,
       "WORD" VARCHAR2(100)
  ) SEGMENT CREATION DEFERRED
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
 TABLESPACE "TBS_MING"
插入数据之前开启10046事件跟踪:
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(50, 419, true);
将数据装载到中间表:
alter table t_exchange exchange partition p1 with table t_exchange_tmp; 此时的数据:
SQL> select count(*) from t_exchange_tmp;

 COUNT(*)
----------
     9999

SQL> select count(*) from t_exchange partition(p1);

 COUNT(*)
----------
        0 将数据加载到历史表:
alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;

SQL> alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;
alter table t_exchange_his exchange partition p1 with table t_exchange_tmp
*
ERROR at line 1:
ORA-14130: UNIQUE constraints mismatch in ALTER TABLE EXCHANGE PARTITION

创建唯一索引:
create unique index t_exchange_his_idx_03 on t_exchange_his(sno,oitime); 再次加载数据,还是同样地错。
观察一下历史表和中间表的定义,unique约束只能是sno的主键约束了,这个说法不对,只是说明可能是主键约束的缘故,中间表增加主键约束:
alter table t_exchange_tmp add primary key (sno);

再次加载数据:
SQL> alter table t_exchange_his exchange partition p1 with table t_exchange_tmp;

Table altered.
成功! 关闭10046事件:
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(50, 419, false); 数据已经成功从中间表到了历史表:
SQL> select count(*) from t_exchange_tmp;

 COUNT(*)
----------
        0

SQL> select count(*) from t_exchange_his partition(p1);

 COUNT(*)
----------
     9999 检查索引:  
SQL> !ora unusable
\n=============Fri Jun 22 19:55:13 CST 2018===================\n

Session altered. UNUSABLE_INDEXES
-------------------------------------------------------------------------
ALTER INDEX MING.SYS_C0012382 REBUILD ONLINE;             --中间表主键索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_03 REBUILD ONLINE;    --历史表的唯一索引
ALTER INDEX MING.SYS_C0012380 REBUILD ONLINE;             --历史表主键索引
ALTER INDEX MING.T_EXCHANGE_IDX_03 REBUILD ONLINE;        --源表的唯一索引
ALTER INDEX MING.SYS_C0012378 REBUILD ONLINE;             --源表主键索引
ALTER INDEX MING.T_EXCHANGE__HIS_IDX_02 REBUILD PARTITION P1 ONLINE;   --历史表的本地非前缀分区索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P03 ONLINE;   --历史表的全局分区索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P02 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P01 ONLINE;       --源表的全局分区索引
ALTER INDEX MING.T_EXCHANGE_IDX_02 REBUILD PARTITION P1 ONLINE;        --源表的本地非前缀分区索引
ALTER INDEX MING.T_EXCHANGE_HIS_IDX_01 REBUILD PARTITION P01 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P03 ONLINE;
ALTER INDEX MING.T_EXCHANGE_IDX_01 REBUILD PARTITION P02 ONLINE;

13 rows selected.  
 
 
总结
1.从10046中可以看到exchange的过程会以独占模式(exclusive)住两张表,不过执行速度很快,也不用担心阻塞业务dml语句。
2.10046中还考虑ogg和dataguard的影响,都是一些对系统表的修改。
3.装载到历史表的时候,需要两端的表上的约束都要一致。其实也很好理解,这个过程修改的数据字典中的物理位置指向,那么必然要满足约束的要求,否则加载过去的数据违反了表上的主键约束或者唯一约束,那就没有意义了。
4.所有的索引都失效了,可见这种方法的弊端是虽然数据加载快速,但是索引需要重建,这个就比较致命了。如果表很大的话,分区的可用性会变差,日常交易性能衰退,恢复需要的时间长。

您可能感兴趣的文档:

--结束END--

本文标题: oracle分区交换(exchange)技术

本文链接: https://www.lsjlt.com/news/47860.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle分区交换(exchange)技术
    需求:一个几亿条数据的分区表,要把一些老数据分出来,放一个新建的表上。按时间划分,指定时间以前的放在老数据表,指定时间以后的数据保留在原表,然后把备份老数据表空间truncate掉。按照分区操作分区交换...
    99+
    2024-04-02
  • 分区交换 alter table exchange partition 在线表 历史表交换
    创建表test_part_1 默认为users表空间:create table test_part_1(a number, b number)partition by range(a)(  par...
    99+
    2024-04-02
  • 3层交换技术
      我们知道不同的vlan之间要相互的通行必须要借用第三层,也就是网络层,可以路由器也可以是三层的交换机。三层拓扑图 图1-6 创建Vlan并设置为服务端 Switch>en ...
    99+
    2023-01-31
    交换技术
  • H3C交换机型号区分
    H3C S5500-28C-EIH3C:厂商品牌S代表交换机,如果是SR代表业务路由器第一个5代表千兆交换机,如果是3代表千兆上行,百兆下行。如果是7代表高端箱式交换机。9代表核心箱式交换机第二个5代表是三层交换还是二层,大于等于5为路由交...
    99+
    2023-01-31
    交换机 型号 H3C
  • MySQL中怎么交换分区
    这篇文章将为大家详细讲解有关MySQL中怎么交换分区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。交换分区的实现1、交换分区的语法alter ta...
    99+
    2024-04-02
  • Ubuntu mrtg怎么交换分区
    本篇内容主要讲解“Ubuntu mrtg怎么交换分区”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ubuntu mrtg怎么交换分区”吧!Ubuntu的软件管理系统与Debian的相同,俱使用A...
    99+
    2023-06-16
  • 怎么增大swap交换分区
    本篇内容介绍了“怎么增大swap交换分区”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!# dd if=/dev/zero of=/.swap...
    99+
    2023-06-10
  • linux系统有交换分区吗
    本文小编为大家详细介绍“linux系统有交换分区吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux系统有交换分区吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2023-02-17
    linux
  • linux交换分区怎么创建
    这篇文章主要介绍“linux交换分区怎么创建”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux交换分区怎么创建”文章能帮助大家解决问题。linux交换分区就是linux的SWAP分区,它是LI...
    99+
    2023-07-04
  • swap分区详解(创建swap分区,启用swap交换空间,关闭swap交换空间)
    文章目录 swap分区什么是swap分区swap分区使用情况查看工具free案例 swapon 创建swap分区过程 swap分区 什么是swap分区 swap分区是指在Linux操作系统中为了提高系统运行效率...
    99+
    2023-08-19
    linux 运维 服务器
  • Linux中怎么扩展交换分区
    Linux中怎么扩展交换分区,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是交换空间当物理内存 (RAM) 已满时,将使用 Linux 中的交换空间。当物理内存已满时,内存...
    99+
    2023-06-16
  • Linux下怎么创建交换分区
    本篇内容主要讲解“Linux下怎么创建交换分区”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux下怎么创建交换分区”吧!Linux 的交换分区(swap),或者叫内存置换空间(swap s...
    99+
    2023-06-27
  • 本人开办的社区:中国JavaEE技术交流社区
    本人开办的社区:请大家有空的去看看 呵呵希望能给你帮助www.j2eedve.com中国JavaEE广州寒冰动力-视频在线 欢迎您!中国第一家面向全国包括学生特别是为JavaEE爱好者们提供技术交流的社区 JAVA以其跨平台性和安...
    99+
    2023-06-03
  • Linux中怎么创建swap交换分区
    Linux中怎么创建swap交换分区,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、新建磁盘分区作为swap分区1.以root身份进入控制台(登录系统),输入...
    99+
    2023-06-13
  • Ubuntu 中怎么实现mrtg交换分区
    这篇文章将为大家详细讲解有关Ubuntu 中怎么实现mrtg交换分区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Ubuntu mrtg交换分区 Ubuntu mrtg切换到超级用...
    99+
    2023-06-16
  • Golang与C语言的技术交集分析
    Golang与C语言的技术交集分析 近年来,Golang(也称作Go语言)作为一门新兴的、高效的编程语言,逐渐受到了许多开发者的青睐。与此同时,作为程序员们耳熟能详的老牌编程语言之一,...
    99+
    2024-03-07
    golang c语言 技术交集 go语言 网络编程 标准库
  • mysql表分区技术详细介绍
    1、概述     数据库单表到达一定量后,性能会有衰减,像mysql\sql server等犹为明显,所以需要把这些数据进行分区处理。同时有时候可能出现数据剥离什么的,分区...
    99+
    2024-04-02
  • 区块链技术的示例分析
    这篇文章给大家分享的是有关区块链技术的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。区块链技术最初源于解决“拜占庭将军”问题,金融科技的发展使得区块链技术有了更好的应用场...
    99+
    2024-04-02
  • linux系统如何增加swap交换分区
    这篇文章主要介绍了linux系统如何增加swap交换分区,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。linux系统中想要增加swap交换分区,该怎么增加呢?首先点击dock...
    99+
    2023-06-10
  • 如何为Llinux系统添加交换分区
    这篇文章主要介绍如何为Llinux系统添加交换分区,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!swap空间感觉上就是linux的虚拟内存么,当内存不够的时候通过一定的技术手段把当物理内存不够大的时候 把物理内存里的...
    99+
    2023-06-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作