上篇博客《oracle分区》中讲了oracle的几种分区,并且对于oracle的典型分区如Range分区和List分区给了示例。
在实际运用Range分区时,遇到了这样的难题:
createtableTMP_LXQ_1
(
PROPOSALNO VARCHAR2(22),
STARTDATE DATE
)
partitionbyrange(STARTDATE) (
partitionpart_t01values less than(to_date('2008-01-01','yyyy-mm-dd')) ,
partitionpart_t02values less than(to_date('2009-01-01','yyyy-mm-dd')) ,
partitionpart_t03values less than(to_date('2010-01-01','yyyy-mm-dd')) ,
partitionpart_t04values less than(to_date('2011-01-01','yyyy-mm-dd')) ,
partitionpart_t05values less than(to_date('2012-01-01','yyyy-mm-dd')) ,
partitionpart_t06values less than(to_date('2013-01-01','yyyy-mm-dd')) ,
partitionpart_t07values less than(maxvalue)
);
本例中的时间只是到了2013年,然后2013年之后的时间完全放入到了maxvalue中,这确实也是一种解决办法,即有除去2008-2013年的数据时,数据库不会报错。但是这样就改变了我们分区的初衷,分区是想让各个部分的数据均衡,以加快查询。
在oracle11g出现之前,实际工作中经常会遇到这种情况,而处理这种情况,通常是由DBA或者开发人员手动进行分区或者直接定义maxvalue。
Oracle 11g的新增特性Interval分区可以解决这个问题,下面介绍一下Interval分区。
一、interval分区
INTERVAL分区是Oracle11g新增的特性,它是针对Range类型分区的一种功能拓展。对连续数据类型的Range分区,如果插入的新数据值与当前分区均不匹配,Interval-Partition特性可以实现自动的分区创建。
示例:
createtable TMP_LXQ_1
(
proposalnovarchar2(22),
startdatedate
)
partitionby range(STARTDATE)
interval(numtoyminterval(1,'year'))(
partitionpart_t01 values less than(to_date('2008-01-01','yyyy-mm-dd')) ,
partitionpart_t02 values less than(to_date('2009-01-01','yyyy-mm-dd')) ,
partitionpart_t03 values less than(to_date('2010-01-01','yyyy-mm-dd')) ,
partitionpart_t04 values less than(to_date('2011-01-01','yyyy-mm-dd')) ,
partitionpart_t05 values less than(to_date('2012-01-01','yyyy-mm-dd')) ,
partitionpart_t06 values less than(to_date('2013-01-01','yyyy-mm-dd'))
);
如果插入2014年的值,系统会自动的添加一个分区,分区范围为2014-01-01到2014-12-31日。
二、interval分区和range分区的转换
ALTERTABLE TMP_LXQ_1 SET INTERVAL (numtoyminterval(1,'year'));
对于INTERVAL分区表,新增的超过分区上限的数据会自动导致对应的INTERVAL分区被建立。
同样INTERVAL分区表可以方便的转化为RANGE分区表,只需要不输入INTERVAL的值即可:
ALTER TABLETMP_LXQ_1 SET INTERVAL ();
三、interval分区的特点
1.由range分区派生而来
2.以定长宽度创建分区(比如年、月、具体的数字(比如100、500等))
3.分区字段必须是number或date类型
4.必须至少指定一个range分区(永久分区)
5.当有记录插入时,系统根据需要自动创建新的分区和本地索引
6.已有的范围分区可被转换成间隔分区(通过ALTER TABLE SET INTERVAL选项完成)
7.IntervalPartitioning不支持支持索引组织表
8.在Interval Partitioning表上不能创建domain index
四、interval分区问题
在oracle自动创建分区的时候,系统会默认指定一个分区名,系统默认创建的分区名字与我们的分区命名规范会有一定的差距,这个问题暂时还不知道有什么解决方法。
相关推荐
### Oracle表自动按月分区步骤详解 #### 一、背景介绍 在大数据处理与分析领域,数据库表的性能优化显得尤为重要。特别是在面对大量历史数据时,合理地利用表分区技术可以显著提高查询效率,减少资源消耗。Oracle...
Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) 范围分区是将数据基于范围...
PARTITION BY RANGE (year) INTERVAL (1) ( PARTITION p2007 VALUES LESS THAN (2008) ); ``` #### 四、索引分区方法 除了表分区之外,Oracle 还支持对索引进行分区,以进一步提高查询性能和管理效率。索引...
Oracle 分区表分区索引详解 Oracle 分区表分区索引是 Oracle 数据库中的一种重要机制,它可以提高数据的存储和查询效率。下面将详细介绍 Oracle 分区表分区索引的类型、分类、创建方法和维护方式。 一、分区表和...
1. **由Range分区派生而来**: - 间隔分区本质上是对范围分区(Range Partitioning)的一种自动化扩展。在传统范围分区中,管理员需要手动定义分区边界,而间隔分区则能够自动根据预设的间隔(如时间或数值范围)...
5. **区间分区(Interval Partitioning)**:类似于范围分区,但自动创建新的分区,当数据超出现有分区的最大值时。 #### 四、分区策略的选择 选择合适的分区策略对于实现高效的数据管理和查询至关重要。考虑因素...
Oracle分区表是将一个大表根据某个或某些列的值划分为多个逻辑部分,每个部分称为一个分区。每个分区都可以独立进行数据插入、更新和删除,提高了数据库的管理和查询效率。 **分区类型** 1. **范围分区(Range ...
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...
) PARTITION BY RANGE (CREATE_TIME) INTERVAL (NUMTOYMINTERVAL(1, 'year')) ( PARTITION part_t01 VALUES LESS THAN (TO_DATE('2018-11-01', 'yyyy-mm-dd')) ); ``` 2. 按月创建分区表: ```sql CREATE TABLE ...
CREATE TABLE partitioned_table (column1 datatype, ...) PARTITION BY RANGE (column1) (PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (200), ...); ``` **3. 分区操作:** - **添加...
`ROWS BETWEEN`或`RANGE BETWEEN`用于定义计算的行范围,例如`ROWS BETWEEN PRECEDING AND CURRENT ROW`表示当前行及其前一行的和,`BETWEEN INTERVAL 'Day' PRECEDING AND INTERVAL 'Day' FOLLOWING`则指定了基于...