网站建设资讯

NEWS

网站建设资讯

oracle分区怎么实现,oracle分区表操作

oracle数据库怎么建分区

一般语法:

目前创新互联公司已为数千家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、南岗网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

create table t_test (

pk_id number(30) not null,

add_date_time  DATE,

constraintPK_T_TEST primary key (pk_id)

)

PARTITION BY RANGE (add_date_time)

(

PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,

PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,

PARTITION t_test_2014VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))TABLESPACE TS_MISPS

);

oracle表分区和索引分区

一 分区表技术概述

二 分区索引技术概述

⑴ 本地前缀分区索引

适用场景:

如果历史数据整理非常频繁、而且不能承受全局分区索引重建的长时间带来的索引不可用

同时、日常交易性能尚能接受、则建议设计为本地非前缀分区索引

注意:本地分区索引不能保证唯一性(除非分区键是约束的一部分)

缺点:

主要体现在数据的高可用性方面

当DROP分区后、全局分区索引则全部INVALID、除非REBULID

但数据量越大、重建索引的时间越长

一般来讲,如果需要将数据按照某个值逻辑聚集,多采用范围分区。如基于时间数据的按“年”、“月”等分区就是很典型的例子。在许多情况下,范围分区都能利用到分区消除特性( = = = between…and 等筛选条件下)。

如果在表里无法找到一个合适的属性来按这个属性完成范围分区,但你又想享受分区带来的性能与可用性的提升,则可以考虑使用散列分区。(适合使用 = IN 等筛选条件)

如果数据中有一列或有一组离散值,且按这一列进行分区很有意义,则这样的数据就很适合采用列表分区。

如果某些数据逻辑上可以进行范围分区,但是得到的范围分区还是太大,不能有效管理,则可以考虑使用组合分区(范围分区+hash 或范围分区+列表分区)。

create table products_table

(

id number(2),

name varchar2(50),

sale_date date

)

partition by range(sale_date)

interval (numtoyminterval(1,'month'))

(

partition p_month_1 values less than (to_date('2016-01-01','yyyy-mm-dd'))

)

如图,取 products_table 中的 sale_date 列作为分区键创建按月自增分区;

所有销售时间在 ‘2016-01-01’之前的记录都会被放入 p_month_1 分区;

销售时间在‘2016-01-01’之后的记录在插入时Oracle会自动创建记录所属月的分区;

比如当有销售时间分别为 2016年1月20日 与 2016年2月20日 的两条记录插入时,Oracle会分别创建一个上限值为 ‘2016-01-31’的分区和一个上限值为‘2016-02-29’的分区来存储这两条记录

Oracle分区是怎样优化数据库的?

Oracle的分区可以分为:列表分区、范围分区、散列分区、复合分区。

1、增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用;

2、减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,可能比整个大表修复花的时间更少;

3、维护轻松:如果需要建表,独自管理每个公区比管理单个大表要轻松得多;

4、均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;

5、改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快;

6、分区对用户透明:最终用户感觉不到分区的存在。

Oracle创建分区表操作

1、创建语句

create table p(id number)

partition by range(id)

(partition p1 values less than(100) tablespace t1,

partition p2 values less than(200) tablespace t2,

partition p3 values less than(300) tablespace t3);

2、添加分区

alter table p add partition p4 values less than (400) tablespace t4;

3、清除分区数据

alter table p trunc partition p1;

4、删除分区

alter table p drop partition p1;

oracle如何创建组合分区

oracle组合分区

由于Interval分区是针对range的,11g-12.1版本,目前只有Interval—*一共3种Interval的复合分区

range-list方法:

partition by range (updatetime)

interval (numtodsinterval(1,'day'))

subpartition by list(PSNCODE)

SUBPARTITION TEMPLATE(

SUBPARTITION REGION_1 values('038716'),

SUBPARTITION REGION_2 values('270719') )

(partition p1 values less than(to_date('2014-05-01','yyyy-mm-dd')))

注意:每个分区有2个子分区,分区的子分区需要手动添加

Interval分区目前测试,只支持range先分区的方式

range-hash方法:每个分区10个子hash分区(可以指定每个子分区到单独的表空间)

partition by range (updatetime)

interval(numtodsinterval(1,'day'))

subpartition by hash(PSNCODE)

SUBPARTITION template

( SUBPARTITION p1 TABLESPACE ts1

, SUBPARTITION p2 TABLESPACE ts2

, SUBPARTITION p3 TABLESPACE ts3

, SUBPARTITION P4 TABLESPACE ts4

)

(partition p1 values less than(to_date('2014-05-01','yyyy-mm-dd')))

注意:这种方式可以实现完全自动的分区,非常适合自增长特性的10位数以上的大表

hash分区最好是2的次方个,不然数据会分布不均

range-range方法:子分区需要手动添加,这种分区需要一般比较少见

PARTITION BY RANGE (time_id)

INTERVAL (NUMTODSINTERVAL(1,'DAY'))

SUBPARTITION BY RANGE(amount_sold)

SUBPARTITION TEMPLATE

( SUBPARTITION p_low VALUES LESS THAN (1000)

, SUBPARTITION p_medium VALUES LESS THAN (4000)

, SUBPARTITION p_high VALUES LESS THAN (8000)

, SUBPARTITION p_ultimate VALUES LESS THAN (maxvalue)

)

(PARTITION before_2000 VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy')) )

oracle11g自动分区

在Oracle10g中,没有定义间隔分区,只能通过范围分区实现间隔分区功能,如果要实现自动创建分区,只能通过创建JOB或者scheduler来实现;而在11g中,Oracle直接提供了间隔分区功能,大大简化了间隔分区的实现。

----注:oracle11g虽然可以自动分区,但是分区的名字不能自定义,对于需要定时删除分区时没法处理,不如通过时间范围来手工分区。详见

create table HIP_LOG_NODE_Part

(

ID                   VARCHAR2(32)         not null,

RECORD_TIME          DATE

)tablespace TB_HIP_LOG_NODE

PARTITION BY RANGE (RECORD_TIME) interval (numtoyminterval(1, 'month'))

STORE IN (TB_HIP_LOG_NODE)

(

partition hip_log_node_partition values less than (to_date('2019-08-01 00:00','yyyy-MM-dd HH24:mi')) tablespace TB_HIP_LOG_NODE

);

1、Oracle11g有间隔分区功能,对于使用Range分区的可以按年,月,日来自动生成分区。

2、2019-08-01前的数据(包含8月份的数据)会放入hip_log_node_partition 分区,8月1日后的数据每月只要有数据,就会自动创建一个分区。也就是从9月开始,开始新建分区。

3、interval函数--将数值按标准换算为日期

numtodsinterval、numtodsinterval函数,将数字转成年月,时分秒

详见:

4、查看表分区 select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_SALES';

5、插入数据再次查看分区,详见:

6、修改分区、合并分区、拆分分区,详见 :

7、创建索引(分区索引、全局索引) :

非分区字段创建主键,则创建主键local索引时必须加上分区字段

ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (主键字段,分区字段) USING INDEX LOCAL;

8、oracle 10g创建表分区

9、删除

1.不保留,直接删除:

alter table table_name drop/truncate partition partition_name;

具体用drop还是truncate,得你自己衡量,drop的话原来的分区和数据直接就没有了,truncate的话,只是数据没有了,分区还在。


本文标题:oracle分区怎么实现,oracle分区表操作
URL分享:http://cdweb.net/article/hcocdh.html