我有一个 TimeData 表,必须将其从 2009 年到 2013 年每年划分为几个季度,而接下来的几年则没有划分
我采取了两种方法:
1
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),
) ;
2
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 个分区的值小于(最大值)..这样我就可以克服永远分区的问题,对吗?
最佳答案
自从我从事分区工作以来已经有一段时间了,所以对此持保留态度......
如果您确实正在处理 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 个桶中。
现在先说一说。立即浮现在脑海中的问题:
- 为什么需要每季度进行分区?
- 为什么需要子分区?
- 为什么只到 2013 年? (之后会发生什么?)
- 2013年后,旧数据/分区会怎样?
- 初始加载后,新记录只会添加到“当前日期”分区吗?
- 我们期望每个分区有什么样的数据量?
分区是一种物理属性,由数据使用情况驱动。从我的角度来看,分区粒度通常由数据大小和归档要求驱动。例如,如果每天捕获一百万行日志数据,我可能会按天划分分区,定期为接下来的几天预先创建分区,并将旧的日期更改为只读。数据可能仅在一周内有用,之后可以删除或存档最旧的分区。然后我们就有了一个移动的分区窗口。但如果我每周只获取 10,000 条记录,我只需创建一个每周分区的滚动窗口。并不是说我真的只需要一个分区来保存一周的数据,而是因为它为我提供了一种根据数据保留要求丢弃/归档一周以上的数据(通过分区)的简单方法。最终用户可以按天或按小时或其他方式查看数据。
因此,如果数据按季度查看,并不意味着不能每月对其进行分区(如果这有意义的话)。如果您可以预见到该要求的到来,请尝试选择一种允许您以后更轻松地添加分区的方案。例如,通过范围分区,当他们在一两年内要求时,您可以开始拆分顶部分区。
哦,顺便说一句,如果您以一种很好的可排序方式命名分区(YYYY MM DD ...),那么编写一个执行一些动态 sql 的脚本来“alter table add partition”就变得非常容易”并负责分区创建(如果尚未作为功能添加)。考虑到这一点,上面的第一个和最后一个分区的命名应该有点不同。
关于sql - 表分区,哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8647503/