sql - 表分区,哪个更好?

标签 sql oracle oracle11g

我有一个 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/

相关文章:

插入或删除后的Oracle触发器

php - SQL, "WHERE IN"返回自动排序结果

mysql - SQL Join 返回零,但应该返回正确的值

SQL Server比较机制

sql - 100 个逗号分隔的随机计数器位置值进行求和并显示最近 60 分钟的统计数据

sql - 禁用与特定表关联的所有外键约束

sql - 基于分组依据、前 1 行和 where case 进行更新

sql - 在 Oracle 中,如何对多个数组使用 IN 子句?

xml - Oracle XMLQuery 正在破坏命名空间

sql - ORA-00904 : invalid identifier in subquery (in select clause)