サブパーティショニング (複合パーティショニングとも呼ばれます) は、パーティション化されたテーブルの各パーティションをさらに分割することです。 次の CREATE TABLE
ステートメントを検討します。
CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) )
SUBPARTITIONS 2 (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
テーブル ts
には 3 つの RANGE
パーティションがあります。 これらの各パーティション (p0
、p1
、および p2
) は、さらに 2 つのサブパーティションに分割されます。 実際には、テーブル全体が 3 * 2 = 6
パーティションに分割されます。 ただし、PARTITION BY RANGE
句のアクションによって、これらの最初の 2 つには purchased
カラムで値が 1990 より小さいレコードのみが格納されます。
RANGE
または LIST
でパーティション化されたテーブルをサブパーティション化できます。 サブパーティショニングには、HASH
または KEY
パーティショニングを使用できます。 これは、複合パーティショニングとも呼ばれます。
SUBPARTITION BY HASH
および SUBPARTITION BY KEY
は通常それぞれ、PARTITION BY HASH
および PARTITION BY KEY
と同じ構文規則に従います。 これの例外は、SUBPARTITION BY KEY
は現在 (PARTITION BY KEY
と異なり) デフォルトカラムをサポートしないことで、この目的に使用されるカラムを指定する必要があります (テーブルに明示的な主キーがある場合でも)。 これは既知の問題であり、対処中です。詳細および例については サブパーティションに関する問題を参照してください。
SUBPARTITION
句を使用して個々のサブパーティションのオプションを指定することによって、サブパーティションを明示的に定義することもできます。 たとえば、前の例と同じテーブル ts
をより冗長な形式で作成するには、次のようにします。
CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990) (
SUBPARTITION s0,
SUBPARTITION s1
),
PARTITION p1 VALUES LESS THAN (2000) (
SUBPARTITION s2,
SUBPARTITION s3
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s4,
SUBPARTITION s5
)
);
構文に関するいくつかの注意事項を次に示します。
各パーティションには、同じ数のサブパーティションが必要です。
-
パーティション化されたテーブルのパーティションに
SUBPARTITION
を使用してサブパーティションを明示的に定義する場合は、それらのすべてを定義する必要があります。 つまり、次のステートメントは失敗します:CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s2, SUBPARTITION s3 ) );
このステートメントは、
SUBPARTITIONS 2
を使用していても失敗します。 各
SUBPARTITION
句には、(少なくとも) サブパーティションの名前が含まれている必要があります。 それ以外は、サブパーティションに適切なオプションを設定するか、またはそのオプションのデフォルト設定を想定します。-
サブパーティション名はテーブル全体で一意である必要があります。 たとえば、次の
CREATE TABLE
ステートメントは有効です。CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2, SUBPARTITION s3 ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s4, SUBPARTITION s5 ) );