【问题标题】:How to create Day and Hourly partitioning in Oracle 11g?如何在 Oracle 11g 中创建日和小时分区?
【发布时间】:2015-05-25 08:42:28
【问题描述】:

我正在使用 Oracle-11G 数据库。

我正在尝试创建 day 明智的分区,并再次创建 每小时 级别的子分区。

下面是我正在使用的脚本

CREATE TABLE test_shipments
( order_date    DATE NOT NULL
, delivery_date DATE NOT NULL
)
PARTITION BY RANGE (order_date)
INTERVAL (NUMTODSINTERVAL(1, 'day'))
SUBPARTITION BY RANGE (order_date)
( PARTITION p_2006_jul VALUES LESS THAN (TO_DATE('2006-08-01','YYYY-MM-DD'))
  ( SUBPARTITION p06_jul_e1 VALUES LESS THAN (TO_DATE('2006-08-01 12:00:00','YYYY-MM-DD hh24:mi:ss')) 
  ,SUBPARTITION p06_jul_e2 VALUES LESS THAN (TO_DATE('2006-08-01 13:00:00','YYYY-MM-DD hh24:mi:ss')) 
  ,SUBPARTITION p06_jul_e3 VALUES LESS THAN (TO_DATE('2006-08-01 14:00:00','YYYY-MM-DD hh24:mi:ss')) 
  )
  );

我希望每天都有分区,并且在那一天的每个小时都有子分区。 上面的脚本每天只创建分区。未创建每小时子分区。谁能指导一下?

【问题讨论】:

  • can't do interval subpartitoning;你打算每天手动创建新的子分区吗?分区和子分区是否应该位于不同的列上?
  • 不,它在同一列 (order_date)。我将在我的示例中更改它。它不应该是手动操作。我希望它是动态创建的。有可能吗?
  • 是否有理由不按小时间隔进行分区?

标签: oracle oracle11g


【解决方案1】:

为什么不按小时范围创建简单分区?示例:PARTITION BY RANGE (order_date) INTERVAL (INTERVAL '1' HOUR)

无论如何,这个工作。但是,您应该使用TIMESTAMP 数据类型而不是DATE。对于小时值,您必须创建一个虚拟列。

CREATE TABLE test_shipments (
   order_date    TIMESTAMP(0) NOT NULL,
   order_date_hour NUMBER GENERATED ALWAYS AS (EXTRACT(HOUR FROM order_date)), 
   delivery_date DATE NOT NULL)
PARTITION BY RANGE (order_date)
INTERVAL (INTERVAL '1' DAY)
SUBPARTITION BY LIST (order_date_hour)
SUBPARTITION TEMPLATE
  (SUBPARTITION HOUR00 VALUES (0),
   SUBPARTITION HOUR01 VALUES (1),
   SUBPARTITION HOUR02 VALUES (2),
   SUBPARTITION HOUR03 VALUES (3),
   ...
   SUBPARTITION HOUR22 VALUES (22),
   SUBPARTITION HOUR23 VALUES (23)   
  )
(  
  PARTITION P_20150101 VALUES LESS THAN (TIMESTAMP'2015-01-01 00:00:00')  
);

如果你被强制使用DATE 数据类型,你可以这样做:

CREATE TABLE test_shipments (
   order_date    DATE NOT NULL,
   order_date_hour NUMBER GENERATED ALWAYS AS (TO_CHAR(order_date, 'HH24')), 
   delivery_date DATE NOT NULL)
PARTITION BY RANGE (order_date)
INTERVAL (INTERVAL '1' DAY)
SUBPARTITION BY LIST (order_date_hour)
SUBPARTITION TEMPLATE
  (SUBPARTITION HOUR00 VALUES (0),
   SUBPARTITION HOUR01 VALUES (1),
   SUBPARTITION HOUR02 VALUES (2),
   SUBPARTITION HOUR03 VALUES (3),
   ...
   SUBPARTITION HOUR22 VALUES (22),
   SUBPARTITION HOUR23 VALUES (23)   
  )
(  
  PARTITION P_20150101 VALUES LESS THAN (DATE '2015-01-01')  
);

也许您想将夜间时间分组:

(
SUBPARTITION HOUR_NIGHT VALUES (0,1,2,3,4,5,6, 19,20,21,22,23),
SUBPARTITION HOUR07 VALUES (7),
SUBPARTITION HOUR08 VALUES (8),
SUBPARTITION HOUR11 VALUES (11),
...
SUBPARTITION HOUR17 VALUES (17),
SUBPARTITION HOUR18 VALUES (18)
)

【讨论】:

  • 很好奇为什么时间戳比日期更好?您能否为我的学术目的提供一个简短的解释。提前感谢您的专业知识和耐心
  • 5 年前。我认为您可以根据个人喜好简单地交换它们。 INTERVAL '1' DAY 仅适用于 TIMESTAMP,会有一些隐式转换
  • Wernfried Domscheit 明白了。感谢您的回复和分享您的知识
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2023-03-15
相关资源
最近更新 更多