`

将普通表改为分区表

阅读更多

将普通表改为分区表

Oracle的普通表没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并说明它们各自的特点。

方法一:利用原表重建分区表。


步骤:


SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);


表已创建。


SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;


已创建6264行。


SQL> COMMIT;


提交完成。

SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE))
6 AS SELECT ID, TIME FROM T;


表已创建。


SQL> RENAME T TO T_OLD;


表已重命名。


SQL> RENAME T_NEW TO T;


表已重命名。


SQL> SELECT COUNT(*) FROM T;


COUNT(*)
----------
6264


SQL> SELECT COUNT(*) FROM T PARTITION (P1);


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


SQL> SELECT COUNT(*) FROM T PARTITION (P2);


COUNT(*)
----------
6246


SQL> SELECT COUNT(*) FROM T PARTITION (P3);


COUNT(*)
----------
18


优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。


不足:对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对 T的访问会失败。


适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。





方法二:使用交换分区的方法。


步骤:


SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);


表已创建。


SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;


已创建6264行。


SQL> COMMIT;


提交完成。


SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (MAXVALUE));


表已创建。


SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;


表已更改。


SQL> RENAME T TO T_OLD;


表已重命名。


SQL> RENAME T_NEW TO T;


表已重命名。


SQL> SELECT COUNT(*) FROM T;


COUNT(*)
----------
6264


优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简 单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。


不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。


适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。





方法三:Oracle9i以上版本,利用在线重定义功能


步骤:


SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);


表已创建。


SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;


已创建6264行。


SQL> COMMIT;


提交完成。


SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);


PL/SQL 过程已成功完成。


SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE));


表已创建。


SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW', -
> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);


PL/SQL 过程已成功完成。


SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('YANGTK', 'T', 'T_NEW');


PL/SQL 过程已成功完成。


SQL> SELECT COUNT(*) FROM T;


COUNT(*)
----------
6264


SQL> SELECT COUNT(*) FROM T PARTITION (P2);


COUNT(*)
----------
6246


SQL> SELECT COUNT(*) FROM T PARTITION (P3);


COUNT(*)
----------
18


优点:保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。


不足:实现上比上面两种略显复杂。


适用于各种情况。

分享到:
评论

相关推荐

    oracle普通表转化为分区表的方法

    本文将详细介绍如何通过在线重定义(DBMS_REDEFINITION)将普通表转换为分区表,这是官方给出的四种方法之一,且对系统的影响最小。 在线重定义是一种在不影响用户访问的情况下,改变表结构的方法。以下是将普通表...

    BLOG_如何将一个普通表转换为分区表.pdf

    而将一个普通的数据库表转换为分区表,可以让数据库管理员对数据进行更精细化的管理。 从提供的文件内容可以看出,本文主要介绍的是如何将一个非分区表转换为分区表,其中涉及了四种不同的方法,并且强调了每种方法...

    PostgreSQL 创建表分区

    分区表是主表的子集,它们继承自主表的结构。每个分区都有一个特定的条件来确定它包含哪些数据。在这个例子中,我们创建了两个分区`users_0`和`users_1`,分别用于存储`uid`在0到99和100及以上的数据。 ```sql ...

    linux分区表修复工具

    总的来说,testdisk是一款强大的Linux分区表修复工具,它的易用性和广泛支持的分区格式使其成为系统管理员和普通用户的得力助手。在遇到分区问题时,熟练掌握testdisk的使用方法,可以大大降低数据丢失的风险,并...

    分区表医生

    《分区表医生》是一款专为解决硬盘分区表问题而设计的实用工具,它在面对分区表错误时,能够提供有效的检测和修复功能,为用户的硬盘数据安全提供了强大的保障。分区表是硬盘上至关重要的组成部分,它存储着硬盘上...

    oracle数据表分区知识

    #### 六、普通表转换为分区表 如果现有的表不是分区表,可以通过以下步骤将其转换为分区表: 1. **创建临时分区表**:首先创建一个新的分区表结构,但不包含任何数据。 2. **导入数据**:使用 `INSERT INTO ... ...

    小天才手表z6分区表.zip

    "小天才手表Z6分区表.zip"文件很可能是针对该设备内部存储结构的一个详细描述,它包含了关于如何组织和管理手表系统软件的各个部分的信息。 在电子设备中,分区是将存储空间划分为不同的逻辑区域,每个区域有特定的...

    Android手机各大分区详解1

    在普通启动过程中,用户按下电源键后,secondary stage bootloader从boot分区加载Linux内核和ramdisk,后者作为临时根文件系统。完整的刷机包通常包含一个boot.img文件,它包含了boot分区的所有内容。一旦内核启动,...

    Oracle9i分区存储

    通过这种方式,可以有效地将一个普通表转换为分区表,从而提高数据管理效率和查询性能。需要注意的是,在实际操作过程中还需要考虑数据类型、索引以及触发器等因素的影响。此外,对于大型生产环境而言,还需仔细规划...

    Oracle分区表在油田勘探开发数据库中的应用.pdf

    管理上,分区表并不比普通表复杂,反而在数据管理和维护上提供了更多的灵活性。 在油田勘探开发数据库中,例如“采油井日数据”表,由于涉及的数据量庞大,使用分区表尤为合适。通常情况下,创建这样一个表的SQL...

    Linux硬盘分区与配额管理

    - **主分区**:最多支持四个主分区,在MBR分区表中记录。 - **扩展分区**:四个主分区中的一个可以被定义为扩展分区,扩展分区内部可以进一步细分为多个逻辑分区。 #### 二、分区工具fdisk - **fdisk工具简介**...

    海量数据分区改造的玄与机.pdf

    通过从数据字典中获取相关信息,我们可以构建新的分区表,并按照预设的规则对数据进行分配。在执行过程中,需要先构造表结构,然后填充数据,最后进行测试,以确保分区改造的正确性。 快速测试是验证分区改造效果的...

    PTDD3.5分区恢复软件

    当硬盘分区表损坏或被误修改,该软件能通过扫描硬盘扇区,识别并恢复原有的分区信息,将硬盘恢复到正常状态。它支持MBR(主引导记录)和GPT(GUID分区表)两种分区表格式,涵盖了广泛的操作系统环境,包括Windows、...

    DISKGEN硬盘分区及数据恢复软件

     1、支持传统的MBR分区表格式及较新的GUID分区表格式。  2、支持基本的分区建立、删除、隐藏等操作。可指定详细的分区参数;  3、支持IDE、SCSI、SATA等各种类型的硬盘。支持U盘、USB硬盘、存储卡(闪存卡);  4...

    最新的U盘引导、分区工具

    总结来说,"最新的U盘引导、分区工具"如BootIce,为IT专业人士和普通用户提供了一种简便的方式来管理启动设备和硬盘分区,提升了工作效率并减少了系统故障的困扰。无论是创建启动U盘,还是处理复杂的MBR问题,...

    pq硬盘魔术分区师9.0

    在Windows操作系统中,传统的分区工具如FDISK或MBR(主引导记录)分区表方式已逐渐被GPT(GUID分区表)所取代,因为GPT提供了更大的磁盘容量支持和更高的可靠性。 "PQ Magic",全称PowerQuest PartitionMagic,是...

    Linux下硬盘分区读写程序

    3. **硬盘分区表**:每个硬盘都有一个分区表,它包含了硬盘上的各个分区信息,如起始位置、大小、文件系统类型等。在Linux中,分区信息存储在MBR(主引导记录)或GPT(GUID分区表)中。 4. **磁盘I/O操作**:读写...

    PQ分区大师.

    手动分区意味着用户可以根据自己的需求,自定义硬盘的空间分配,例如为操作系统、应用程序、文档、娱乐等不同用途设置不同的分区。这样可以更好地管理硬盘空间,提高系统运行效率,同时便于数据备份和恢复。 1. **...

    硬盘加密的几种方法介绍

    或者,将该字节改为05H,则不但不能从硬盘启动,即使从软盘启动,硬盘的每个逻辑盘都不可访问。 二、对硬盘启动加口令 我们可以将硬盘的主引导记录和分区信息储存在硬盘并不使用的隐含扇区,然后用Debug重写一个不...

Global site tag (gtag.js) - Google Analytics