关于Oracle 分区实现和操作的几个问题 oracle LIST分区,怎么用

oracle \u7ec4\u5408\u5206\u533a\u5206\u533a(range_list)\u4e0e\u666e\u901a\u5206\u533a\u8868(range)\u4e4b\u95f4\u6570\u636e\u4ea4\u6362

\u4ec0\u4e48\u610f\u601d\uff1f\u4f60\u8bf4\u7684\u662f\u628a\u7ec4\u5408\u5206\u533a\u7684\u6570\u636e\u63d2\u5165\u5230\u666e\u901a\u5206\u533a\u4e2d\uff0c\u76f4\u63a5insert\u5c31\u884c\u554a\uff0c\u8fd9\u4e2a\u6ca1\u4ec0\u4e48\u8981\u6c42\u7684\uff0c\u5982\u679c\u6570\u636e\u91cf\u5927\uff0c\u90a3\u4e48\u4f60\u53ef\u4ee5\u627e\u4e2a\u6761\u4ef6\u5faa\u73af\u63d2\u5165\uff0c\u8fd9\u4e2a\u6ca1\u4ec0\u4e48\u8981\u6c42\u7684\u3002

create table t_partition_list (id number,name varchar2(50))
partition by list(id)(
partition t_list_p1 values (1,2,3,4,5,6,7,8,9) tablespace tbspart01,
partition t_list_p2 values (10,11,12,13,14,15,16,17,18,19) tablespace tbspart02,
partition t_list_p3 values (20,21,22,23,24,25,26,27,28,29) tablespace tbspart03,
partition t_list_pd values (default) tablespace tbspart04);

1. 组合分区表的创建方式("范围-哈稀"),见附1
2. 楼主的需求,即"范围-范围分区",在ORACLE 9i, 10g经过测试都是不能实现的
在附1的基础上修改为"范围-范围"组合分区,创建时报错:ORA-14151:无效的表分区方法
3. 关于sxdtgsh兄的回答,我测了
3.1 没有maxvalue上限分区设置,在插入超出分区的数据时会报错ORA-14400: 插入的分区关键字未映射到任何分区
3.2 按回答的语句创建分区表没有问题,但数据无法按照楼主的需求分布
====附1
附录:创建"范围-哈稀"组合分区表

CREATE TABLE TAB11 (ID NUMBER,DT DATE)
PARTITION BY RANGE (DT)
SUBPARTITION BY HASH (ID) SUBPARTITIONS 2 -- 自分区个数,可以不写,由系统判断
(
PARTITION Y2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'))
(
SUBPARTITION Y2012_H1
,SUBPARTITION Y2012_H2
)
,PARTITION Y2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD'))
(
SUBPARTITION Y2013_H1
,SUBPARTITION Y2013_H2
)
,PARTITION YMAX VALUES LESS THAN (MAXVALUE)
(
SUBPARTITION YMAX_H1
,SUBPARTITION YMAX_H2
)
)
====附2,请楼主检查最后查询的数据分布

create table T_TEST
(
ID NUMBER(20) NOT NULL,
TIME DATE NOT NULL
)
partition by range(TIME, ID) -- 按时间、ID范围分区 这个例子是按年的
(
partition P_2012_10 values less than (to_date('2013-01-01','yyyy-MM-dd'), 10),
partition P_2012_20 values less than (to_date('2013-01-01','yyyy-MM-dd'), 20),
partition P_2012_MAX values less than (to_date('2013-01-01','yyyy-MM-dd'), MAXVALUE),
partition P_2013_10 values less than (to_date('2014-01-01','yyyy-MM-dd'), 10),
partition P_2013_20 values less than (to_date('2014-01-01','yyyy-MM-dd'), 20),
partition P_2013_MAX values less than (to_date('2014-01-01','yyyy-MM-dd'), MAXVALUE),
partition P_MAX values less than (MAXVALUE,MAXVALUE)
);
INSERT INTO T_TEST VALUES (1,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (12,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (32,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (2,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (12,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (33,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (3,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (23,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (43,TO_DATE('20151204 00:00:00','YYYYMMDD HH24:MI:SS'));
SELECT * FROM T_TEST;
SELECT * FROM T_TEST PARTITION(P_2012_10);
SELECT * FROM T_TEST PARTITION(P_2012_20);
SELECT * FROM T_TEST PARTITION(P_2012_MAX);
SELECT * FROM T_TEST PARTITION(P_2013_10);
SELECT * FROM T_TEST PARTITION(P_2013_20);
SELECT * FROM T_TEST PARTITION(P_2013_MAX);
SELECT * FROM T_TEST PARTITION(P_MAX);

oracle 10g的组合分区只支持 range-list和range-hash。11g好像是可以range-range。如果id不多,可以用range-list。组合分区有时会导致数据字典异常大--数据库存在大量子分区的元数据,能不用就不用。表太大可以考虑分库分表,不是特别大就分区+分区索引。如果只有少数表需要做组合分区,倒可以考虑。
如果查询条件包含分区键,数据库会自动去分区找数据,也可以在查询表名后增加subpartition()来直接访问子分区数据

--你要用time,id范围进行分区,只能用组合范围分区,只有大分区,没有子分区,下面的例子
create table T_TEST
(
ID NUMBER(20) NOT NULL,
TIME DATE NOT NULL
)
partition by range(TIME, ID) -- 按时间、ID范围分区 这个例子是按年的
(
partition P_2012_10 values less than (to_date('2013-01-01','yyyy-MM-dd'), 10),
partition P_2012_20 values less than (to_date('2013-01-01','yyyy-MM-dd'), 20),
partition P_2012_30 values less than (to_date('2013-01-01','yyyy-MM-dd'), 30),
partition P_2013_10 values less than (to_date('2014-01-01','yyyy-MM-dd'), 10),
partition P_2013_20 values less than (to_date('2014-01-01','yyyy-MM-dd'), 20),
partition P_2013_30 values less than (to_date('2014-01-01','yyyy-MM-dd'), 30)
);
--至于查询,如果你知道数据在那个分区里,可以指定分区查询,如果不知道,只要条件里有分区列,oracle会自动优化的。如果没有oralce会扫描全部分区,然后做all操作。

扩展阅读:oracle 建日期分区表语句 ... oracle 如何使用分区查询 ... oracle 主分区 和 子分区 ... oracle 建分区表 每天 ... oracle自动分区怎么设置 ... oracle表按日期自动分区 ... oracle分区表按月分区 ... oracle分区表怎么查询 ... oracle分区表删除部分数据 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网