【前言】oracle官方建议当表的大小大于2GB的时候就使用分区表进行管理,分区表相对于小的表管理和性能上都有很大的优势,本文档暂时不介绍具体的优势,主要介绍几种普通表转换成分区表的方法;-阿里云开发者社区

开发者社区> 流浪的猫666> 正文

【前言】oracle官方建议当表的大小大于2GB的时候就使用分区表进行管理,分区表相对于小的表管理和性能上都有很大的优势,本文档暂时不介绍具体的优势,主要介绍几种普通表转换成分区表的方法;

简介:
+关注继续查看

【方法概述】oracle官方给了以下四种操作的方法:
A) Export/import method(导入导出)
B) Insert with a subquery method(插入子查询的方法)
C) Partition exchange method(交换分区法)
D) DBMS_REDEFINITION(在线重定义)

这些方法的思路都是创建一个新的分区表,然后把旧表的数据转移到新表上面,接着转移相应的依赖关系,最后进行表的重命名,把新表和旧表rename。
其中A、B、C这三种方法都会影响到系统的正常使用,本文档不做详细的介绍,本文档主要介绍D方法,这种方法是目前普遍在进行普通表转换成分区表的方法。

【在线重定义进行分区表的操作】整个操作的思路如下,以SCOTT下的EMP表为例

  1. 先确认下表能不能进行分区
    基于主键的确认

BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE('SOCTT','EMP',DBMS_REDEFINITION.CONS_USE_PK);
END;
/
PL/SQL procedure successfully completed.显示的是没有问题的

2.进行临时表的创建,以DEPTNO作为分区的选项
CREATE TABLE SCOTT.EMP_1
(
EMPNONUMBER(4),
ENAMEVARCHAR2(10 BYTE),
JOBVARCHAR2(9 BYTE),
MGRNUMBER(4),
HIREDATEDATE,
SALNUMBER(7,2),
COMMNUMBER(7,2),
DEPTNONUMBER(2)
)
PARTITION BY RANGE (DEPTNO)
(
PARTITION EMP_A1 VALUES LESS THAN (20),
PARTITION EMP_A2 VALUES LESS THAN (30),
PARTITION EMP_A3 VALUES LESS THAN (40),
PARTITION EMP_A4 VALUES LESS THAN (50),
PARTITION EMP_A5 VALUES LESS THAN (60)

  )

3.开始执行数据的迁移
EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCOTT', 'EMP', 'EMP_1');

4.如果表的数据很多,3步的时候可能会很长,这期间系统可能会继续对表EMP进行写入或者更新数据,那么可以执行以下的语句,这样在执行最后一步的时候可以避免长时间的锁定(该过程可选可不选)
BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCOTT', 'EMP', 'EMP_1');
END;
/

5.进行权限对象的迁移
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCOTT', 'EMP','EMP_1',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/

6.查询相关错误,在操作之前先检查,查询DBA_REDEFINITION_ERRORS试图查询错误:
select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS;

7.结束整个重定义
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('scott', 'emp', 'emp_1');
END;
/

【总结】做过一个大小2.3GB,总行数360万行的表,整个过程大概花了56秒的时间,整个过程还是相当快的。建议具体的生产环境的执行需要经过严格测试后执行,测试的过程中大概就能知道整个过程的执行时间长度。

另如果再执行的过程中发生错误,可以通过以下语句结束整个过程:
BEGIN
DBMS_REDEFINITION.ABORT_REDEF_TABLE(uname => 'SCOTT',
orig_table => 'EMP',
int_table => 'EMP_1'
);
END;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
分区表查询条件使用浅析
如果有个分区表,分区列为A、B、C三列,我要查询B列为某些值的数据,MaxCompute还能充分发挥分区表的优势吗?答案是肯定的,MaxCompute依然能发挥分区列的优势!在底层解析SQL执行计划时,只会将符合条件的分区纳入计算,而不是进行全表扫描。
1816 0
Oracle 表空间利用率及对象大小查询
1. 查看所有表空间大小 SQL> select tablespace_name,sum(bytes)/1024/1024 M from dba_data_files group by tablespace_name; 2.
577 0
Node.js Cookie管理
Cookie 管理 我们可以使用中间件向 Node.js 服务器发送 cookie 信息,以下代码输出了客户端发送的 cookie 信息: var express=require('express'); var cookieParser=require('cookie-parser'); var util=require('util'); var app=express(); app.
996 0
MaxCompute的分区配置和使用
详细介绍MaxCompute里的分区的用法
7203 0
教程:如何使用Data Lake Analytics创建分区表
# 前言 [Data Lake Analytics ](https://www.aliyun.com/product/datalakeanalytics)(后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS、TableStore上的数据进行查询分析。
3057 0
ORACLE已建表能否创建分区
Oracle数据库里面,如果已经创建了一个表,创建时没有给表进行分区,现在由于性能等方面原因需要对该表创建分区。能否直接把一个未分区的表修改成分区表呢(即能否通过ALTER语句把该表修改成分区表呢)?答案是不能,至少目前版本不能。
771 0
Oracle如何预估将要创建的索引和表的大小
Oracle如何预估将要创建的索引和表的大小 1. 对于表和索引空间的预估,可以使用DBMS_SPACE包的CREATE_TABLE_COST和CREATE_INDEX_COST存储过程,虽然没有看这两个存储过程的实现,但猜测平均行长算法,会根据预计行数,做一些计算,字段定义算法,则会根据每个字段的长度,和预计行数,做一些计算,其实和我们手工根据这些算法,计算的方式类似,只是封装起来,便于调用。
1121 0
[20121114]Oracle数据文件大小限制.txt
[20121114]Oracle数据文件大小限制.txtSQL> show parameter db_block_sizeNAME           TYPE        VALUE-------------- ----------- ------db_bl...
590 0
44
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载