oracle三种分区的方式,Oracle 分区表 总结大全(3)
(10) Horizontal sub setting of data cannot be performed during the redefinition.
在Oracle 10.2.0.4和11.1.0.7 版本下,在线重定义可能会遇到如下bug:
Bug 7007594 - ORA-600 [12261]
http://blog.csdn.net/tianlesoftware/archive/2011/03/02/6218681.aspx
在线重定义的大致操作流程如下:
(1)创建基础表A,如果存在,就不需要操作。
(2)创建临时的分区表B。
(3)开始重定义,将基表A的数据导入临时分区表B。
(4)结束重定义,此时在DB的 Name Directory里,已经将2个表进行了交换。即此时基表A成了分区表,我们创建的临时分区表B 成了普通表。 此时我们可以删除我们创建的临时表B。它已经是普通表。
下面看一个示例:
1. 创建基本表和索引
sql> conn icd/icd;
已连接。
sql> create table unpar_table (
2 id number(10) primary key,
3 create_date date
4 );
表已创建。
sql> insert into unpar_table select rownum, created from dba_objects;
已创建72288行。
sql> create index create_date_ind on unpar_table(create_date);
索引已创建。
sql> commit;
提交完成。
2. 收集表的统计信息
sql> exec dbms_stats.gather_table_stats('icd', 'unpar_table', cascade => true);
pl/sql 过程已成功完成。
3. 创建临时分区表
sql> create table par_table (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));
表已创建。
4. 进行重定义操作
4.1 检查重定义的合理性
sql> exec dbms_redefinition.can_redef_table('icd', 'unpar_table');
pl/sql 过程已成功完成。
4.2 如果4.1 没有问题,开始重定义,这个过程可能要等一会。
这里要注意:如果分区表和原表列名相同,可以用如下方式进行:
SQL> BEGIN
DBMS_REDEFINITION.start_redef_table(
uname => 'ICD',
orig_table => 'unpar_table',
int_table => 'par_table');
END;
/
如果分区表的列名和原表不一致,那么在开始重定义的时候,需要重新指定映射关系:
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(
'ICD',
'unpar_table',
'par_table',
'ID ID, create_date TIME', -- 在这里指定新的映射关系
DBMS_REDEFINITION.CONS_USE_PK);
这一步操作结束后,数据就已经同步到这个临时的分区表里来了。
4.3 同步新表,这是可选的操作
SQL> BEGIN
2 dbms_redefinition.sync_interim_table(
3 uname => 'ICD',
4 orig_table => 'unpar_table',
5 int_table => 'par_table');
6 END;
7 /
PL/SQL 过程已成功完成。
4.4 创建索引,在线重定义只重定义数据,索引还需要单独建立。
sql> create index create_date_ind2 on par_table(time);
索引已创建。
4.5 收集新表的统计信息
sql> exec dbms_stats.gather_table_stats('icd', 'par_table', cascade => true);
pl/sql 过程已成功完成。
4.6 结束重定义
SQL> BEGIN
2 dbms_redefinition.finish_redef_table(
3 uname => 'ICD',
4 orig_table => 'unpar_table',
5 int_table => 'par_table');
6 END;
7 /
PL/SQL 过程已成功完成。
结束重定义的意义:
基表unpar_table 和临时分区表par_table 进行了交换。 此时临时分区表par_table成了普通表,我们的基表unpar_table成了分区表。
我们在重定义的时候,基表unpar_table是可以进行DML操作的。 只有在2个表进行切换的时候会有短暂的锁表。
5. 删除临时表
SQL> DROP TABLE par_table;
表已删除。
6. 索引重命名
SQL> ALTER INDEX create_date_ind2 RENAME TO create_date_ind;
索引已更改。
7. 验证
sql> select partitioned from user_tables where table_name = 'UNPAR_TABLE';
par
---
yes
sql> select partition_name from user_tab_partitions where table_name = 'UNPAR_TABLE';
partition_name
------------------------------
p1
p2
p3
p4
sql> select count(*) from unpar_table;
count(*)
----------
72288
sql> select count(*) from unpar_table partition (p4);
count(*)
----------
72288
sql>
三. 分区表的其他操作
3.1 添加新的分区
添加新的分区有2中情况:
(1)原分区里边界是maxvalue或者default。 这种情况下,我们需要把边界分区drop掉,加上新分区后,在添加上新的分区。 或者采用split,对边界分区进行拆分。
(2)没有边界分区的。 这种情况下,直接添加分区就可以了。
以边界分区添加新分区示例:
(1)分区表和索引的信息如下:
SQL> create table custaddr
2 (
3 id varchar2(15 byte) not null,
4 areacode varchar2(4 byte)
5 )
6 partition by list (areacode)
7 (
8 partition t_list556 values ('556') tablespace icd_service,
9 partition p_other values (default)tablespace icd_service
10 );
表已创建。
SQL> create index ix_custaddr_id on custaddr(id)
2 local (
3 partition t_list556 tablespace icd_service,
4 partition p_other tablespace icd_service
5 );
索引已创建。
(2)插入几条测试数据:
SQL> insert into custaddr values('1','556');
已创建 1 行。
SQL> insert into custaddr values('2','551');
已创建 1 行。
SQL> insert into custaddr values('3','555');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from custaddr;
ID AREA
--------------- ----
1 556
2 551
3 555
SQL> select * from custaddr partition(t_list556);
ID AREA
--------------- ----
1 556
SQL>
(3)删除default分区
sql> alter table custaddr drop partition p_other;
表已更改。
sql> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';
table_name partition_name
------------------------------ ------------------------------
custaddr t_list556
(4)添加新分区
SQL> alter table custaddr add partition t_list551 values('551') tablespace icd_service;
表已更改。
SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
CUSTADDR T_LIST556
CUSTADDR T_LIST551
(5)添加default 分区
SQL> alter table custaddr add partition p_other values (default) tablespace icd_service;
表已更改。
SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
CUSTADDR T_LIST556
CUSTADDR T_LIST551
CUSTADDR P_OTHER
(6)对于局部索引,oracle会自动增加一个局部分区索引。验证一下:
sql> select owner,index_name,table_name,partitioning_type from dba_part_indexes where index_name='ix_custaddr_id';
owner index_name table_name
---------------------- ------------------------------ ------------------
icd ix_custaddr_id custaddr
sql> select index_owner,index_name,partition_name from dba_ind_partitions where index_name='ix_custaddr_id';
index_owner index_name partition_name
------------------------------ ------------------------------ ------------------
icd ix_custaddr_id p_other
icd ix_custaddr_id t_list551
icd ix_custaddr_id t_list556
分区索引自动创建了。
3.2 split 分区拆分
在3.1 中,我们说明了可以使用split的方式来添加分区。 这里我们用split方法继续上面的实验。
sql> alter table custaddr split partition p_other values('552') into (partition t_list552 tablespace icd_service, partition p_other tablespace icd_service);
oracle三种分区的方式,Oracle 分区表 总结大全(3)相关推荐
- oracle11g同步,Oracle11g三种数据同步方式-Oracle
DataGurd: 主要备库的方式,就是数据库对数据库的备份方式,主要是解决容灾的. 流复制: 主要是利用ORACLE的归档日志,进行增量备份来实现的,不仅可以配置只复制某些表,还可以配置仅复制某些表 ...
- oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...
mysql.sqlserver.oracle三种数据库维护索引.外键.字段语法总结 1. MYSQL数据库 1) 创建索引 CREATE INDEX index_name ON tabl ...
- 三种语句可以恢复Oracle数据库误删除数据
有很多朋友都遇到过在操作数据库时误删除某些重要数据的情况,如果数据库没有备份而且数据有十分重要的情况下怎么做才能找回误删除的数据呢?我在这里为大家介绍几种误删除数据库中重要数据的恢复方法(不考虑全库备 ...
- MySQL、SqlServer、Oracle 三种数据库的优缺点总结
MySQL.SqlServer.Oracle 三种数据库的优缺点总结 一.MySQL 二.SqlServer 三.Oracle 一.MySQL 优点: 体积小.速度快.总体拥有成本低,开源: 支持多种 ...
- qlserver、Mysql、Oracle三种数据库的优缺点总结
这篇文章主要介绍了sqlserver.Mysql.Oracle三种数据库的优缺点总结,需要的朋友可以参考下 一.sqlserver 优点: 易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能 ...
- Oracle三种循环:for,while,do...while(PL/SQL)
1. Oracle三种循环与Java类比 1.1 for 循环 Oralce中结构 for 变量i in 下限..上限(条件判断语句) loop执行语句 end loop; Java中结构 for(初 ...
- 深入分析Kafka架构(三):消费者消费方式、三种分区分配策略、offset维护
本文目录 一.前言 二.消费者消费方式 三.分区分配策略 3.1.分配分区的前提条件 3.2.Range分配策略 3.3.RoundRobin分配策略 3.4.Sticky分配策略 四.offset维 ...
- 了解mysql的三种不同安装方式的区别
学习目的:了解mysql的三种不同安装方式的区别 学习内容: mysql 的安装有三种:分别是源码安装.二进制安装.rpm安装. 源码安装的优势:linux操作系统开放源代码,因此在其上面安装的软件大 ...
- 【Kafka】Kafka消费者组三种分区分配策略roundrobin,range,StickyAssignor
文章目录 1. 分配策略 1.1 Range(默认策略) 1.2 RoundRobin RoundRobin的两种情况 1.3 StickyAssignor 2. Range策略演示 参考 相关文章 ...
最新文章
- 打开正经图片,你可能会看到一张黄图,这种造假方法能同时骗过AI和人眼
- OPENFILENAME文件类型过滤 lpstrFilter
- No module named pycurl(无法使用yum和pip的情况下的解决方案)
- c语言用命令行编译运行程序_使用C程序执行系统命令
- html文段源码,HTML 段落
- 贪心的Mixing Milk(洛谷P1208题题解,Java语言描述)
- 创意or鸡肋?亚马逊想让智能音箱“手机”化
- select 存储过程 mysql_MySQL存储过程无法使用SELECT(基本问题)
- 三方应用集成_华为携手利尔达完成业界首个5G工业智能网关预商用集成验证
- Git常用命令的使用方法
- c语言流程图各个框的作用,C语言流程图的三种基本结构
- 【.Net】.Net操作AD域账号,获取AD用户后可以获取的属性列表 directoryEntry Properties list
- matlab中erf什么,matlab中的误差函数erf是什么意思?
- cannot allocate memory in static TLS block问题记录
- 非线性控制2.0——模糊逼近
- 计算机毕业设计ssm农商行贷款管理系统f1gnk系统+程序+源码+lw+远程部署
- linux毫米波雷达程序,ARS408-21毫米波雷达学习笔记
- Qt的文件导入和导出txt格式;
- 在Linux(ubuntu10.10)系统中使用摄像头之USB摄像头
- 云计算如何助力夯实制造业“底盘”?材料科学领域专家学者分享新材料前沿技术成果
热门文章
- 修改mysql数据库编码
- 综合布线系统走线槽架的产品选型
- 与工作流关联的服务器发生意外错误
- Hacker(十)----常用入侵工具
- 【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- 组件的使用...
- Unicode 转换 ASCII,ASCII 转换 Unicode 在线网站工具
- 数学建模之图像处理---颜色建模
- [C#基础知识系列]专题十七:深入理解动态类型
- Visual Studio 2005 SQL Server 2005 are COMING!
- 怎么在html中写当前时间,html页面怎么获取当前时间