【发布时间】: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