【问题标题】:oracle partition by group_id and subpartition monthlyoracle 分区按 group_id 和 subpartition 每月
【发布时间】:2015-02-18 00:19:37
【问题描述】:

我想创建一个这样的表。

create table some_data ( 
  id number(19,0),
  group_id number(19,0),
  value float,
  timestamp timestamp
);

对于这个表,我希望数据像这样存储

 group_id=1
    jan-2015
    feb-2015
    ...
group_id=2
    jan-2015
    feb-2015
    ...    

等等。所以我假设我必须为 group_id 创建一个按范围划分的分区,然后还按时间戳列的范围创建一个子分区,对吧?

所以它应该是这样的:

create table some_data ( 
  id number(19,0),
  group_id number(19,0),
  value float,
  timestamp timestamp
)
PARTITION BY RANGE (group_id)
SUBPARTITION BY RANGE ("TIMESTAMP") 
INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
(
 PARTITION part_1 values LESS THAN (TO_DATE('01.02.2015','DD.MM.YYYY'))
 );

这是对的吗?还有一个问题:有了这个分区,如果添加了新的 group_id,oracle 会自动为新的 group_id 创建一个新的分区,并为新月份的新数据创建新的分区吗?

【问题讨论】:

  • 为什么要关心数据的存储方式?
  • @PlanItMichael 好吧,在这里存储的措辞可能是错误的,我想以某种方式创建分区以更快地获得查询结果,并且我认为要获得更快的查询结果,我需要将分区创建为我在上面描述过
  • 不一定。如果您要查询的数据基数较低(即,跨多行仅存在几个不同的值),您可以使用位图索引。在查询多列时,它们速度极快并且运行良好。但是,它们不适用于频繁更新的表。
  • 好吧,这个表有很多行(200.000.000+),每天我们有大约 200 万个新插入,我不知道我们每天删除多少行

标签: oracle partitioning


【解决方案1】:

子分区级别不支持间隔分区:

http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_7002.htm#SQLRF54559

你可以这样定义:

create table some_data ( 
  id number(19,0),
  group_id number(19,0),
  value float,
  timestamp timestamp  -- not good naming
)
PARTITION BY RANGE ("TIMESTAMP")
INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
SUBPARTITION BY RANGE (group_id) -- it could be hash or list as well
   subpartition template(
     ...
   )
(
 PARTITION part_1 values LESS THAN (TO_DATE('01.02.2015','DD.MM.YYYY'))
);

【讨论】:

  • 是的!这个有效,谢谢。对于时间戳:这只是一个示例,列的实际数量及其名称当然与此处不同。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多