巧妙使用exchange partition的一个案例

前几天写过一篇文章讨论过分区表的在线重定义,其实就是另外一个分区表和现有的分区表做数据字典信息的交换
http://blog.itpub.net/23718752/viewspace-1734195/
当然了除此之外还是需要一些相应的权限,在这个过程中会在内部做类似物化视图一样的数据刷新,保持数据表的可访问性。
在不同的场景中还是会有不同的取舍,比如现在的场景,情况发生了一些变化,分区存在问题,要重新分区是肯定的,除此之外,开发希望把一些旧数据做一些清理,比如根据时间来分区,可能对于开发来说,最近一段时间的数据保留就可以了,之前很旧的数据就只是需要做一个备份,直接清掉,基本评估下来,可能90%以上的数据都需要做清理。
所以这个时候还是使用在线重定义就有一些弊端了。
首先是时间的问题,在线重定义的过程中,其实内部还是在做数据的复制工作。相当于把数据从一个源流动到另外一个源。内部是这样的数据刷新,对外保持始终可以访问,所以对于上亿条记录来说这个时间就比较长了。
其次就是效率问题,因为重新分区后,可能大部分数据都不需要了,这个时候做在线重定义还会做数据复制,然后在一定的时间之后还是需要再次做数据清理。这个时候相当于做了重复工作。效率会大大折扣。

这个时候根据目前的问题情况,考虑通过以下的方式来实现。
首先是数据内部的复制,为了减少这种开销,可以考虑把分区表的默认分区和一个普通表做交换,这个过程是一个数据字典级的变更,所以速度还是很快的。
然后可以交换后的分区做split partition的操作。这个时候split操作时间会持续极短。影响相对来说很小。
然后就是数据的清理,这个时候清理工作就会变为一种选择性的数据导入,因为需要导入的数据量还是很小的。所以只需要把需要时间范围内的数据导入即可。
我们来简单试一试。
还是之前所用的分区表,现在只有一个默认分区。
CREATE TABLE tab_part 
   ( 
   col1 varchar2(30), 
   col2 DATE 
   ) 
   partition BY range(col2) 
   (  
     partition tab_part_maxvalue values less than (maxvalue)
   ); 
我们希望达到的效果是下面的分区形式。
CREATE TABLE tab_part 
   ( 
   col1 varchar2(30), 
   col2 DATE 
   ) 
   partition BY range(col2) 
   ( 
   partition tab_part_2014 VALUES less than (to_date('2014-08-01','yyyy-mm-dd')), 
   partition tab_part_2015 VALUES less than (to_date('2015-08-01','yyyy-mm-dd')),  
   partition tab_part_maxvalue values less than (maxvalue)
   );
然后给分区表创建分区索引,然后我们简单插入几条数据。
create index inx_tab_part on tab_part(col1) local;

INSERT INTO tab_part  VALUES(1,SYSDATE-400);                                                                      
INSERT INTO tab_part  VALUES(11,SYSDATE-600);
commit;
数据情况如下:
COL1                           COL2
------------------------------ ---------
1                              09-APR-15
11                             05-MAR-14
这个时候我们创建一个表test_tab01来做为中间过渡的一个表。

CREATE TABLE TEST_TAB01(
col1 varchar2(30),                
col2 DATE);

这个时候就开始使用exchange partition来把分区的数据做个交换。

ALTER TABLE tab_part EXCHANGE PARTITION tab_part_maxvalue
  WITH TABLE TEST_TAB01 ;
交换的速度很快,来看看操作之后的数据情况,可以看到数据都到了test_tab01里面。

SQL> select count(*)from tab_part;

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

SQL> select count(*)from test_tab01;

  COUNT(*)
----------
         2
这个时候分区还是没变,但是数据给交换出来了。
SQL> select table_name,partition_name from user_tab_partitions where table_name='TAB_PART';

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
TAB_PART                       TAB_PART_MAXVALUE
我们接下来要做split partition的工作。

SQL> alter table tab_part  SPLIT PARTITION tab_part_maxvalue at (to_date('2014-08-01','yyyy-mm-dd')) INTO ( PARTITION tab_part_2014 , PARTITION tab_part_maxvalue);

Table altered.

SQL> alter table tab_part  SPLIT PARTITION tab_part_maxvalue at (to_date('2015-08-01','yyyy-mm-dd')) INTO ( PARTITION tab_part_2015 , PARTITION tab_part_maxvalue);

Table altered.
这个时候再来看分区的情况,就达到了我们预期的要求。

SQL> select table_name,partition_name from user_tab_partitions where table_name='TAB_PART';

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
TAB_PART                       TAB_PART_2014
TAB_PART                       TAB_PART_2015
TAB_PART                       TAB_PART_MAXVALUE
如果对exchange partition还是有一定的疑虑,想索引会不会受到影响,如果是本地索引是没有问题的,如果是global全局索引,就需要rebuild

SQL> select index_name,partition_name,status from user_ind_partitions where index_name='INX_TAB_PART';

INDEX_NAME                     PARTITION_NAME                 STATUS
------------------------------ ------------------------------ --------
INX_TAB_PART                   TAB_PART_2014                  USABLE
INX_TAB_PART                   TAB_PART_2015                  USABLE
INX_TAB_PART                   TAB_PART_MAXVALUE              USABLE

这个时候重新分区完成了,要做的事情就是导入数据了,选择性的导入数据,根据时间戳即可。
当然了好几亿条记录,不建个索引根本说不过去。
create index inx_test_tab01 on test_tab01(col);
我们就可以使用insert的方式导入数据即可。

insert into tab_part select *from test_tab01 where col>sysdate-10;

最后为了把exchange partiton的一个精髓突出出来和在线重定义区分开了,可以做一个很简单的小例子。
我们还是创建原来的表tab_part

CREATE TABLE tab_part 
   ( 
   col1 varchar2(30), 
   col2 DATE 
   ) 
   partition BY range(col2) 
   ( 
   partition tab_part_maxvalue values less than (maxvalue)
   ); 

create index inx_tab_part on tab_part(col1) local;
我们接着创建一个表test_tab01,这个时候唯一的不同之处就是字段名不同,但是数据类型相同。

CREATE TABLE TEST_TAB01(
a varchar2(30),                
b DATE);
然后尝试去做exchange partition的时候是没有问题的。

ALTER TABLE tab_part EXCHANGE PARTITION tab_part_maxvalue
  WITH TABLE TEST_TAB01 ;
我们看看交换分区之后的表结构变化情况

SQL> desc tab_part
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               VARCHAR2(30)
 COL2                                               DATE

SQL> desc test_tab01
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  VARCHAR2(30)
 B                                                  DATE

 可以看到字段名没有任何变化,还是原来的字段名,但是在内部做了数据字典信息的交换,把相应的段信息做了交换而已。这也就exchange partition的主要思想。
通过这个案例可以看到,exchange partition还是大有可为,而且在很多场景下可以达到很满意的效果,在线重定义也不错,不过在选择的时候还是需要综合评定,没有最好的方法,最有最适合的方法。

时间: 2024-09-27 09:57:07

巧妙使用exchange partition的一个案例的相关文章

SPSS聚类分析——一个案例演示聚类分析全过程

SPSS聚类分析--一个案例演示聚类分析全过程 摘要: 案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称.热量.钠含量.酒精含量.价格.数据来自<SPSS for Windows 统计分析> 案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称.热量.钠含量.酒精含量.价格.数据来自<SPSS for Windows 统计分析>data11-03.点击下载 [一]问题一:选择那些变量进行聚类?--采用"R型聚类" 1.现在我们

调试-一个案例用MVC做的,我没有看到他的首页ASPX,但有cshtml文件

问题描述 一个案例用MVC做的,我没有看到他的首页ASPX,但有cshtml文件 请问怎么调试运行cshtml文件, 还有我仔细查看过他个个文件夹,只有后台登录, 首页都没看到,请问怎么调试cshtml问题! 解决方案 ASP.NET MVC 3开始,不使用ASP.NET默认的模板引擎,而使用Razor(.cshtml/.vbhtml)模板引擎了. 根据你的Route可以判断首页执行的是哪个视图,默认,首页执行的是HomeController的Index方法.在方法上点右键,转到视图可以找到对应

图片-在java ee的一个案例中,登录页面时出现乱码,怎么回事呢?

问题描述 在java ee的一个案例中,登录页面时出现乱码,怎么回事呢? 解决方案 检查一下页面的编码是否是gb2312.gbk.utf-8等. 解决方案二: 服务器的编码设置是否也是utf-8? 解决方案三: 一个是工作空间的编码设成utf-8的 还有就是页面的编码格式也要设置成utf-8的试试呢 解决方案四: 写个过滤器也是可以的 解决方案五: 工作空间的编码集设置.项目的编码集设置.jsp页面上的编码集设置.response的contenttype,response的characterEn

电脑黑屏故障的一个案例分析

电脑黑屏是一种常见的电脑故障,也是一种难于处理的故障,但有时导致这个故障的原因却是很简单的.一个很小的疏忽就会导致很严重的电脑故障.黑屏故障的原因一般是由以下部件引起的:显示器本身有故障.显卡损坏.主机电源有问题.主板或CPU出现故障等.案例如下: 笔者购买了一台机器,主要配置如下:CPU为速龙2200+,主扳为华擎KT400,内存为现代256兆DDR266,硬盘为西捷80G,显卡为 64兆杂牌GF2,显示器是金长城17".这台机器装好后一直运行很稳定,可前几天突然出现开机后显示器没有任何显示的

从一个案例看mysqldump的复制选项

写在前面  背景其实出现在两周前了,当时只是简单地排查了下原因就草草了事,今天再次仔细研究了下官方文档,发现还是有些嚼头的,多半是自己之前没有去刻意的思考,其实一点点小特性,有时候还是可以让我们的工作简化很多的. 奇怪的小案例  这个小案例可能对于某些人来说并不陌生,当时的情境是给一个客户执行一个dump文件,就这么一个小小的操作,后来尽然让客户发现了蹊跷:导入的数据备库上没有.  同事告知给我的情况,我也是觉得蛮不可思议,立马与客户配合客户再次确认,发现确实是操作没有同步过去,马上检查了主备复

通过Google挖掘细分市场的一个案例

我是亦仁, 前阿里运营,现持续创业者. 本文篇幅较长,无阅读门槛,比较适合想兼职赚点零花钱的程序员.想找场景学习编程的小伙伴以及没有创业点子的朋友.全文4000字,完整读完大约需要10分钟. 理论上来说,如果我们仅仅是想赚点小钱,而不是想像马云(微博)爸爸一样通过一款产品去改变世界,那么任意一个关键词,都有机会通过Google挖掘出一个可以赚钱的细分市场.而事实上,也确实可以做到这一点,下文我会一步步向大家阐述如何利用Google这个强大的工具来挖掘痛点,实现推广,在细分市场占领一席之地,进而赚

开发移动版网页的技巧:一个案例

在智能手机日益普遍的今天,网页设计必须考虑到小屏幕智能手机的要求.专门开发手机应用自然是一个不错的方案,但是毕竟耗费精力,况且还需要针对不同设备进行开发和维护. 开发移动版网页是另一个不错的选择.这件事情看起来简单,却也有许多细节和门道.Useit 网站最近的一篇文章对手机版网页设计的探讨值得参考. 这篇文章以报道韩国流行明星资讯的网站 allkpop.com 为例.Allkpop 的手机版网页是这样的: AllKpop 做对了好几件事情 一是内容,Useit 的调查认为手机上的杀手级应用是消耗

Domino 8.5.1和Exchange 2010共用一个邮件域实现邮件收发

说道邮件系统,我们大家肯定首先想到的是Microsoft Exchange,然后就是IBM的Domino产品,同时我们也知道Exchagne是集成于AD的,可Domino不集成AD:那如何把两种不同厂商的邮件服务器同时部署在一个邮件域内呢,具体方法见下. 一.环境准备 1 环境服务器和客户端 1 AD/DNS 服务器 192.168.220.254 windows2008 R2 2 dsgrd-mail01 服务器 192.168.220.253 windows2008R2 + exchange

服务器安全狗导致ASP.NET网站运行出错的一个案例

  字典中的关键字:"RegistryPermission"所添加的关键字:"RegistryPermission" 报错,因为服务器上安全狗对.net程序关键字过于苛刻引出报错. 今天碰到一个.net的报错,之前并没见过这种报错,也没有太多的详细信息."/"应用程序中的服务器错误. 字典中的关键字:"RegistryPermission"所添加的关键字:"RegistryPermission" 说明: 执