探讨Oracle分区表
一年又一年,又到年底了,对于数据库的分区表需要检查一下,有无最大分区,次分区是否需要追加分区,如果程序不是自动追加分区的话,那么年中结算的时候,就会报错。
1、oracle分区主要有五种类型
(1)RANGE分区 范围分区
(2)LIST分区 列表分区
(3)HASH分区 哈希分区
(4)Range-Hash 复合分区
(5)Range-List 复合分区
2、使用分区表的好处
1)由于将数据分散到各个分区中,减少了数据损坏的可能性;
2)可以对单独的分区进行备份和恢复;
3)可以将分区映射到不同的物理磁盘上,来分散IO;
4)提高可管理性、可用性和性能;
5)适用于大型OLAP系统。
3、检查当期分区以及分区中的High_Value值
SQL> col table_name for A13
SQL> col partition_name for A12
SQL> col partitioning_type for a6
SQL> col subpartitioning_type for a6
SQL> col high_value for a80
SQL> SELECT table_name, partition_name,high_value,partitioning_type,subpartitioning_type
2 FROM (SELECT a.table_name, a.partition_name,high_value,b.partitioning_type,b.subpartitioning_type,
3 rank() over(PARTITION BY a.table_name ORDER BY a.partition_name DESC) rankid
4 FROM dba_tab_partitions a,dba_part_tables b
5 where a.table_name = 'PART_TB_NAME'
6 and a.table_name = b.table_name)
7 WHERE rankid <= 3; TABLE_NAME PARTITION_NA HIGH_VALUE PARTIT SUBPAR
------------- ------------ -------------------------------------------------------------------------------- ------ ------
PART_TB_NAME PMAX MAXVALUE RANGE NONE
PART_TB_NAME P20131130 TO_DATE(' 2013-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA RANGE NONE
PART_TB_NAME P20131031 TO_DATE(' 2013-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA RANGE NONE
以上SQL取分区表的前三个分区,同统计相关表的相关信息。
4、APPEND分区
首先查询最大分区是否已经含有数据:没有数据,就可以直接删除,然后再重新创建最大分区。
SELECT COUNT(1) FROM PART_TB_NAME PARTITION(pmax);--
ALTER TABLE PART_TB_NAME DROP PARTITION pmax;
ALTER tABLE PART_TB_NAME ADD PARTITION P20140131 values less than (TO_DATE('2014-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) TABLESAPCE TESTDATA;
ALTER tABLE PART_TB_NAME ADD PARTITION P20140228 values less than (TO_DATE('2014-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) TABLESAPCE TESTDATA;
ALTER tABLE PART_TB_NAME ADD PARTITION P20140331 values less than (TO_DATE('2014-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) TABLESAPCE TESTDATA;
ALTER TABLE PART_TB_NAME ADD PARTITION pmax values less than (maxvalue) TABLESAPCE TESTDATA; --#新建最大分区
5、SPLIT分区
如果最大分区里有数据,需要将最大分区里的数据剥离出去,然后再重新追加分区。
select COUNT(1) from PART_TB_NAME partition(PMAX); --
select COUNT(1) from PART_TB_NAME partition(P20131231); --2
alter table PART_TB_NAME split partition pmax at(to_date('2013-12-31','yyyy-mm-dd')) into (partition P20131231,partition pmax);
--将分区键值小于20131231的数据split到P20131231分区中。
alter table PART_TB_NAME split partition pmax at(to_date('2014-01-31','yyyy-mm-dd')) into (partition P20140131,partition pmax);
select COUNT(1) from PART_TB_NAME partition(P20131231);--
select COUNT(1) from PART_TB_NAME partition(P20140131);--
select COUNT(1) from PART_TB_NAME partition(PMAX); --0 接着再去追击分区
6、检查是否分区中还有子分区
SELECT * FROM dba_tab_subpartitions; --查看是否有复合分区
7、检查分区索引
SQL> column INDEX_NAME format a30
SQL> column PARTITION_NAME format a30
SQL> SELECT index_name, NULL partition_name, status
2 FROM dba_indexes
3 WHERE table_name = upper('PART_TB_NAME')
4 AND partitioned = 'NO'
5 UNION
6 SELECT index_name, partition_name, status
7 FROM user_ind_partitions
8 WHERE index_name IN
9 (SELECT index_name
10 FROM dba_indexes
11 WHERE table_name = upper('PART_TB_NAME'))
12 ORDER BY 1, 2, 3; INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
PK_PART_TB_NAME VALID
8、重建全局索引
drop index idx_part_tb_name ;--这个是存在风险的,尤其是也的数据量很大的时候,操作需谨慎。
create index idx_part_tb_name
on part_tb_name (opt_dt) global
partition by range (opt_dt)
(
partition P20131231 values less than (to_date('2014-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS')) tablespace testdata1,
partition p20140131 values less than (to_date('2014-02-01 00:00:00','SYYYY-MM-DD HH24:MI:SS')) tablespace testdata1,
partition PMAX values less than (maxvalue) tablespace testdata1
);
9、创建本地索引
create index idx_part_tb_name on part_tb_name(opt_dt) local;
10、摘录总结
比较表级别分区操作的索引分区维护
表级分区操作 |
非分区索引 |
本地分区索引 |
全局分区索引 |
增加分区 |
索引不受影响 |
索引不受影响 |
索引不受影响 |
拆分分区 |
整个索引被标记为UNUSABLE |
受拆分操作影响的分区上的索引被标记为UNUSABLE |
索引的所有分区都被标记为UNUSABLE |
移动分区 |
整个索引被标记为UNUSABLE |
被移动的分区上的索引被标记为UNUSABLE |
索引的所有分区都被标记为UNUSABLE |
交换分区 |
整个索引被标记为UNUSABLE |
被交换的分区上的索引被标记为UNUSABLE |
索引的所有分区都被标记为UNUSABLE |
合并分区 |
整个索引被标记为UNUSABLE |
受合并操作影响的分区上的索引被标记为UNUSABLE |
索引的所有分区都被标记为UNUSABLE |
截断分区 |
整个索引被标记为UNUSABLE |
索引不受影响 |
索引的所有分区都被标记为UNUSABLE |
删除分区 |
整个索引被标记为UNUSABLE |
本地索引分区被删除,其余索引分区不受影响 |
索引的所有分区都被标记为UNUSABLE |
令数据只读 |
不可能实现,除非整个表示静态的 (表上没有DML操作) |
通过表空间隔离可以令分区级别索引数据只读 |
理论上可以令分区级别索引数据只读。 实际上无法实现,除非整个表是静态的 |
11、程序自动添加分区脚本
--判断当日的表分区是否已经创建
SELECT COUNT(1)
INTO v_count
FROM user_tab_partitions
WHERE table_name = 'PART_TB_NAME'
AND partition_name = 'P' || to_char(SYSDATE, 'yyyymmdd'); --如果没有创建当日数据的分区,主动为分区表添加分区结构
IF v_count = 0 THEN
var_sql := 'alter table PART_TB_NAME add PARTITION p' ||
to_char(SYSDATE, 'yyyymmdd') ||
' VALUES LESS THAN (TO_DATE(''' ||
to_char(SYSDATE + 1, 'yyyymmdd') ||
''',''yyyymmdd)) tablespace testdata' ||
to_char(SYSDATE, 'MM');
dbms_utility.exec_ddl_statement(var_sql);
END IF;
12、Oracle11g新特性
11g自动分区技术:
CREATE TABLE partition_table
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(128),
CREATED DATE
)
PARTITION BY RANGE (CREATED)
INTERVAL(NUMTOYMINTERVAL(1, 'month'))
(PARTITION P20131130 VALUES LESS THAN (TO_DATE('2013-12-01', 'yyyy-mm-dd')));
--这样,就会每个月系统自动生成一个分区
--INTERVAL (NUMTODSINTERVAL(1,'day')) 表示每天
--INTERVAL (NUMTOYMINTERVAL(1,'YEAR')) 表示每年
13、分区表的相关维护
本部分摘录于网络博客。
1、增加表分区
--range partitioned table
ALTER TABLE PART_TB_NAME ADD P20131231 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss'));
--list partitioned table
ALTER TABLE list_partition ADD PARTITION01 VALUES ('');
--Adding Values for a List Partition
ALTER TABLE list_partition MODIFY PARTITION PARTITION02 ADD VALUES('');
--Dropping Values from a List Partition
ALTER TABLE list_partition MODIFY PARTITION PARTITION01 DROP VALUES('');
--hash partitioned table
ALTER TABLE hash_partition ADD PARTITION03;
--增加subpartition
ALTER TABLE range_hash_partition MODIFY PARTITIONTEST ADD SUBPARTITION PARTITIONTEST1;
注:hash partitioned table 新增partition时,现有表的中所有data都有重新计算hash值,然后重新分配到分区中。所以被重新分配的分区的indexes需要rebuild 。
2、删除分区
ALTER TABLE PART_TB_NAME DROP PARTITION PMAX;
3、分区合并
1)合并父分区
ALTER TABLE PART_TB_NAME MERGE Partition1, Partition2 INTO PARTITION Partition3 UPDATE INDEXES;
--如果省略update indexes子句的话,必须重建受影响的分区的index;
ALTER TABLE PART_TB_NAME MODIFY Partition2 REBUILD UNUSABLE LOCAL INDEXES;
2)合并子分区
ALTER TABLE merge_partition
MERGE SUBPARTITIONS Partition1, Partition2 INTO SUBPARTITION Partition2 UPDATE INDEXES;
4、转换分区
可以将分区表转换成非分区表,或者几种不同分区表之间的转换。
CREATE TABLE hash_part02 AS SELECT * FROM hash_partition WHERE 1=2;
ALTER TABLE hash_partition EXCHANGE Partition2 WITH TABLE hash_part02;
这时,分区表hash_partition中的Partition2分区的资料将被转移到hash_part02这个非分区表中。
探讨Oracle分区表的更多相关文章
- 谈一下如何设计Oracle 分区表
在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,所有数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...
- 深入学习Oracle分区表及分区索引
关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: • Range(范围)分区 • Has ...
- oracle 分区表和分区索引
很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...
- 谈一下怎样设计Oracle 分区表
在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,全部数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...
- ORACLE分区表、分区索引详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt160 ORACLE分区表.分区索引ORACLE对于分区表方式其实就是将表分段 ...
- 【三思笔记】 全面学习Oracle分区表及分区索引
[三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...
- oracle分区表彻底删除的办法,处理删不掉的不规则表名
Oracle分区表彻底删除的办法当对一个不再使用的分区表进行drop后,查询user_tab_partitions视图发现出现如下不规则的分区表表名:SQL> select distinct t ...
- Oracle分区表常见操作
Oracle分区表常用于业务中大表使用,如历史交易记录表等,提高表记录查询效率.本文主要描述范围分区表的创建.新增以及索引创建. Oracle操作分区表相关信息 显示数据库所有分区表的信息:DBA_P ...
- ORACLE分区表操作
ORACLE分区表的操作应用 摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用. 在大型的企业应用或企业级的数据库应用中,要处理的数据 ...
随机推荐
- VUE之文字跑马灯效果
VUE之文字跑马灯效果 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> <me ...
- phpstorm扩展
1, CodeGlance 代码地图插件 <img src="https://pic1.zhimg.com/50/v2-721f173bafcb9b60853819c32780 ...
- linux 编译安装amqp
背景: 下面的内容是我根据网上博客小松的文章 https://www.phpsong.com/2223.html 做的修改,因为我走到make 编译amqp这步报错 最开始报下面的这个错误,是因为要安 ...
- javascript双等号引起的类型转换
隐性类型转换步骤 一.首先看双等号前后有没有NaN,如果存在NaN,一律返回false. 二.再看双等号前后有没有布尔,有布尔就将布尔转换为数字.(false是0,true是1) 三.接着看双等号前后 ...
- java学习-struts基础(一)
struts发展 struts是Apache软件基金会赞助的一个开源项目,是一个基于Java EE的MVC开源实现. 它为Servlet/JSP技术的应用提供技术框架2001.7--Struts1正式 ...
- python3 连接HBase
db_url = 'http://47.93.89.99:8765' from traceback import format_exc import phoenixdb as pb class Uti ...
- Linux 文件内容查看工具介绍-cat,less,more,tail,head
Linux 文件内容查看工具介绍 作者:北南南北来自:LinuxSir.Org摘要: 本文讲述几种常用文件内容的查看工具,比如cat.more.less.head.tail等,把这些工具最常用的参数. ...
- DateUtils 通用类
package com.egaoqi.util; import org.apache.commons.lang3.time.DateFormatUtils; import java.text.Pars ...
- elasticsearch版本不同,批量查询也不相同
网上搜到批量查询可以通过TransportClient实现,但官方推荐使用RestHighLevelClient实现 注意: We plan on deprecating the TransportC ...
- .Net调用Java端带有WS-Security支持的Web Service【亲测通过】
做了几年的开发,今天终于鼓起勇气开通了博客园.平时都是找各种大牛,看他们的分享博客的解决BUG.从今天起,我也开始分享我学习之路.还望大家多多支持! 最近收到一个采用Axis2实现的WebServic ...