【问题标题】:Oracle multicolumn partitioning vs using a subpartitionOracle 多列分区与使用子分区
【发布时间】:2010-12-07 15:47:10
【问题描述】:

除了显而易见的,谁能解释多列分区和使用子分区之间的区别?哪一个更适合 OLTP 场景?有关详细信息,请参阅《Oracle 数据库管理员指南》中的Managing Partitioned Tables and Indexes

在多列上分区的表的一个(愚蠢)示例是:

CREATE TABLE demo1
(
   year          NUMBER, 
   month         NUMBER,
   day           NUMBER,
   instance      NUMBER, /* assuming this can only be 1 or 2 */
   other1        VARCHAR2(50),
   other2        VARCHAR2(50),
   other3        VARCHAR2(50)
) 
PARTITION BY RANGE (year,instance) 
(
   PARTITION data_2009_inst1 VALUES less than (2009,2) TABLESPACE data_2009,
   PARTITION data_2009_inst2 VALUES less than (2009,3) TABLESPACE data_2009,
   PARTITION data_2010_inst1 VALUES less than (2010,2) TABLESPACE data_2010,
   PARTITION data_2010_inst2 VALUES less than (2010,3) TABLESPACE data_2010,
   PARTITION data_2011_inst1 VALUES less than (2011,2) TABLESPACE data_2011,
   PARTITION data_2011_inst2 VALUES less than (2011,3) TABLESPACE data_2011
);

同样,子分区表的例子是:

CREATE TABLE demo2
(
   year          NUMBER, 
   month         NUMBER,
   day           NUMBER,
   instance      NUMBER, /* assuming this can only be 1 or 2 */
   other1        VARCHAR2(50),
   other2        VARCHAR2(50),
   other3        VARCHAR2(50)
) 
PARTITION BY RANGE (year) 
SUBPARTITION BY LIST (instance) /* Cannot subpartition by range in 10gR2 */
   SUBPARTITION template 
   (
      SUBPARTITION i1 VALUES (1),
      SUBPARTITION i2 VALUES (2),
      SUBPARTITION ix VALUES (DEFAULT)
   )
(
   PARTITION data_2009 VALUES less than (2010) TABLESPACE data_2009,
   PARTITION data_2010 VALUES less than (2011) TABLESPACE data_2010,
   PARTITION data_2011 VALUES less than (2012) TABLESPACE data_2011
);

现在这些表之间有什么区别?它们在“逻辑上”不一样吗?我知道向 demo2 添加分区要容易得多,因为随着时间的流逝,您需要在 demo1 上拆分分区以获得更多分区。在 OLTP 场景中哪个更好?

顺便说一句,我在 INSTANCE 编号上进行分区的原因与 Oracle RAC 有关。我正在尝试创建“实例关联”以阻止“热块”减慢数据库速度,因为这些需要通过 RAC 节点之间的互连发送。 (我们已经凭经验证明这确实对我们的测试产生了影响)。

【问题讨论】:

  • 知道为什么这在使用 INTERVAL 时不起作用吗? ALTER TABLE mytable MODIFY PARTITION BY RANGE(START_DATE, END_DATE) INTERVAL(NUMTODSINTERVAL(1,'day')) (分区 p_first 值小于 (to_date('2016-06-01', 'yyyy-mm-dd'), to_date ('2016-06-01', 'yyyy-mm-dd')));

标签: oracle partitioning multiple-columns


【解决方案1】:

您的情况可能没有任何区别,但总的来说,子分区允许您以 2 种不同的方式进行分区,例如范围哈希、范围列表。您的子分区示例是范围列表,但相当于单级范围分区。但是,如果您的子分区类似于您链接的文档中的以下示例,则不能使用单级:

ALTER TABLE quarterly_regional_sales 
   ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))
      STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING
         (
          SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),
          SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),
          SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),
          SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'),
          SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'),
          SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX')
         );

【讨论】:

    【解决方案2】:

    子分区的一个优点是它们允许对子分区进行单独的细粒度管理。例如,在数据存档表中,假设不仅基于日期,还基于另一个值有不同的保留要求。

    使用您的示例,您可能需要将值 instance = 1 的数据保留 7 年,但 instance = 2 的数据可以在 4 年后丢弃。子分区将允许您删除包含实例 = 2 的数据的子分区,而与其他值无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多