我有TimeData表,从2009年到2013年,每年必须划分为几个季度,未来几年都没有。
我做了两种方法:
CREATE TABLE TimeData (
id NUMBER PRIMARY KEY NOT NULL,
day_name varchar(45),
day NUMBER(2),
month NUMBER(2),
quart NUMBER(1),
year NUMBER(4)
)
PARTITION BY LIST (year)
SUBPARTITION BY LIST (quart)
(
SUBPARTITION q1 values (1),
SUBPARTITION q2 values (2),
SUBPARTITION q3 values (3),
SUBPARTITION q2 values (4)
)
(
SUBPARTITION y_09 VALUES (2009),
SUBPARTITION y_10 VALUES (2010),
SUBPARTITION y_11 VALUES (2011),
SUBPARTITION y_12 VALUES (2012),
SUBPARTITION other VALUES (DEFAULT),
) ;
CREATE TABLE TimeData (
id NUMBER PRIMARY KEY NOT NULL,
day_name varchar(45),
day NUMBER(2),
month NUMBER(2),
year NUMBER(4)
)
PARTITION BY LIST (year)
SUBPARTITION BY RANGE (month)
(
SUBPARTITION q1 values less than(4),
SUBPARTITION q2 values less than(7),
SUBPARTITION q3 values less than(10),
SUBPARTITION q2 values less than(13)
)
(
SUBPARTITION y_09 VALUES (2009),
SUBPARTITION y_10 VALUES (2010),
SUBPARTITION y_11 VALUES (2011),
SUBPARTITION y_12 VALUES (2012),
SUBPARTITION other VALUES (DEFAULT),
);
这两种方法都在2012年之后继续进行分区,我无法弄清楚如何克服这种情况
但问题是,'夸脱'字段是否会让它变得更好?计算可能较少
或没有它,减少存储空间?!
**更新
刚刚进入我脑海中的第三种方法是,有16个分区(4个季度* 4年),第17个分区的值小于(maxvalue)。这样我就可以过来永远分区了,对吧?
答案 0 :(得分:3)
自从我使用分区以来已经有一段时间了,所以带上一粒盐......
如果真的是你正在处理16个固定分区,那么之后什么都没有,你只需要这16个分区而不是更多,那么可以简单地使用范围分区,其中第一个季度延伸到时间的开始和上个季度到时间结束(用你自己的细目代替日期):
PARTITION BY RANGE (date)
(PARTITION p2009_q1 VALUES LESS THAN (TO_DATE('2009-04-01', 'YYYY-MM-DD')),
PARTITION p2009_q2 VALUES LESS THAN (TO_DATE('2009-07-01', 'YYYY-MM-DD')),
PARTITION p2009_q3 VALUES LESS THAN (TO_DATE('2009-10-01', 'YYYY-MM-DD')),
PARTITION p2009_q4 VALUES LESS THAN (TO_DATE('2010-01-01', 'YYYY-MM-DD')),
PARTITION p2010_q1 VALUES LESS THAN (TO_DATE('2010-04-01', 'YYYY-MM-DD')),
...
PARTITION p2013_q3 VALUES LESS THAN (TO_DATE('2014-09-01', 'YYYY-MM-DD')),
PARTITION p2013_q4 VALUES LESS THAN MAXVALUE)
或者你可以哈希到16个桶中。
现在暂且不说了。立即浮现的问题:
分区是一种物理属性,将由数据使用驱动。从我的角度来看,分区粒度通常由数据大小和归档要求驱动。例如,如果每天捕获一百万行日志数据,我可能会按日分区,定期为即将到来的日子预先创建分区,并将旧时更改为只读。数据可能仅在一周内有用,在此之后可以删除或存档最旧的分区。然后我们有一个移动的分区窗口。但如果我每周只获得10,000条记录,我只需创建一个每周分区的滚动窗口。并不是说我真的只需要一周的数据分区,而是因为它为我提供了一种简单的方法来根据数据保留要求下载/存档超过一周(通过分区)的数据。最终用户可以按天或按小时或其他任何方式查看数据。
因此,如果每季度查看数据,并不意味着如果有意义的话,不能每月对其进行分区。尝试选择一种方案,以便以后可以更轻松地添加分区,如果您可以预见到该要求即将到来。例如,使用范围分区,您可以在一年或两年内请求分割顶部分区。
哦,顺便说一句,如果你以一种很好的可排序方式命名你的分区(YYYY MM DD ...),编写一个脚本可以很容易地做一些动态的sql来“改变表添加分区” “并查看分区创建(如果尚未添加为功能)。考虑到这一点,上面的第一个和最后一个分区应该有点不同。
答案 1 :(得分:0)
@Glen有很多好主意,但是如果您对更重要的重新设计持开放态度,您可能需要考虑使用单个日期列和间隔分区。
create table TimeData
(
id number primary key,
the_date date
)
partition by range(the_date)
interval (numToYMInterval(3, 'month'))
(
partition first_partition values less than (date '0001-01-01')
);
使用单个日期列而不是多个数字和varchar列具有以下几个显着优势:
间隔分区可以显着提高可扩展性;您永远不必担心预先创建新分区。