明らかなことは別として、複数列のパーティション化とサブパーティションの使用の違いを説明できる人はいますか? また、OLTP シナリオにはどちらが適していますか? 詳細は、『Oracle Database管理者ガイド』のパーティション表と索引の管理に関する項を参照してください。
複数の列でパーティション化されたテーブルの (ばかげた) 例は次のとおりです。
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
);
これらのテーブルの違いは何ですか? それらは「論理的に」同じではありませんか?時間の経過とともにより多くのパーティションを取得するには、demo1 でパーティションを分割する必要があるため、demo2 にパーティションを追加する方がはるかに簡単であることはわかっています。OLTP シナリオではどちらが優れていますか?
ちなみに、INSTANCE 番号でパーティショニングを行っている理由は、Oracle RAC に関係しています。「インスタンス アフィニティ」を作成して、「ホット ブロック」がデータベースの速度を低下させないようにしようとしています。これらは RAC ノード間の相互接続を介して送信される必要があるためです。(これがテストで違いを生むことを経験的に証明しました)。