プライマリ・コンテンツに移動
Oracle® Database VLDBおよびパーティショニング・ガイド
12c リリース1 (12.1)
B71291-10
目次へ移動
目次
索引へ移動
索引

前
次

同一サイズのパーティションを強制する複数列のレンジ・パーティション表の作成

次の例では、どのサプライヤがどの部品を配送するかに関する情報が格納されている表supplier_partsに対して、複数列のパーティション化を使用する方法を示します。少数の専門の部品のみを提供するサプライヤが存在する一方で、非常に多くの部品を提供するサプライヤも存在するため、同じサイズのパーティションにデータを分散するには、表をsupplier_idに基づいてパーティション化するのでは十分ではありません。かわりに、(supplier_id, partnum)で表をパーティション化し、同じサイズのパーティションを手動で強制します。

supplier_idが10より小さいすべての行は、partnum値に関係なくパーティションp1に格納されます。列partnumsupplier_idが10の場合にのみ評価され、partnumが200以上の場合、対応する行はパーティションp1p2またはp3に挿入されます。supplier_partsのレンジのパーティション・サイズを同一にするには、supplier_idでレンジ・パーティション化され、partnumでハッシュ・サブパーティション化されたコンポジット・レンジ - ハッシュ・パーティション表を選択します。

複数列のパーティション表にパーティション・バウンドを定義する場合、いくつかのルールに従う必要があります。たとえば、3つの列abおよびcでレンジ・パーティション化された表があるとします。個々のパーティションには、次のようなレンジ値があります。

P0(a0, b0, c0)
P1(a1, b1, c1)
P2(a2, b2, c2)
...
Pn(an, bn, cn)

各パーティションに指定するレンジ値は、次のルールに準拠している必要があります。

  • a0a1以下で、a1a2以下である必要があります(以降同様)。

  • a0=a1の場合、b0b1以下である必要があります。a0 < a1の場合、b0およびb1は任意の値でかまいません。a0=a1かつb0=b1の場合、c0c1以下である必要があります。b0<b1の場合、c0およびc1は任意の値でかまいません(以降同様)。

  • a1=a2の場合、b1b2以下である必要があります。a1<a2の場合、b1およびb2は任意の値でかまいません。a1=a2かつb1=b2の場合、c1c2以下である必要があります。b1<b2の場合、c1およびc2は任意の値でかまいません(以降同様)。

CREATE TABLE supplier_parts (
   supplier_id      NUMBER, 
   partnum          NUMBER,
   price            NUMBER)
PARTITION BY RANGE (supplier_id, partnum)
  (PARTITION p1 VALUES LESS THAN  (10,100),
   PARTITION p2 VALUES LESS THAN (10,200),
   PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE));

次の3つのレコードを表に挿入します。

INSERT INTO supplier_parts VALUES (5,5, 1000);
INSERT INTO supplier_parts VALUES (5,150, 1000);
INSERT INTO supplier_parts VALUES (10,100, 1000);

supplier_idで一意に識別されるため、最初の2つのレコードはパーティションp1に挿入されます。ただし、3番目のレコードは、パーティションp1のすべてのレンジの上限値に正確に一致するため、データベースでは次のパーティションに一致しているとみなされ、パーティションp2に挿入されます。partnumの値が200より小さいという基準に一致しているため、パーティションp2に挿入されます。

SELECT * FROM supplier_parts PARTITION (p1);

SUPPLIER_ID    PARTNUM      PRICE
----------- ---------- ----------
          5          5       1000
          5        150       1000

SELECT * FROM supplier_parts PARTITION (p2);

SUPPLIER_ID    PARTNUM      PRICE
----------- ---------- ----------
          10       100       1000