次の例では、どのサプライヤがどの部品を配送するかに関する情報が格納されている表supplier_partsに対して、複数列のパーティション化を使用する方法を示します。少数の専門の部品のみを提供するサプライヤが存在する一方で、非常に多くの部品を提供するサプライヤも存在するため、同じサイズのパーティションにデータを分散するには、表をsupplier_idに基づいてパーティション化するのでは十分ではありません。かわりに、(supplier_id, partnum)で表をパーティション化し、同じサイズのパーティションを手動で強制します。
supplier_idが10より小さいすべての行は、partnum値に関係なくパーティションp1に格納されます。列partnumはsupplier_idが10の場合にのみ評価され、partnumが200以上の場合、対応する行はパーティションp1、p2またはp3に挿入されます。supplier_partsのレンジのパーティション・サイズを同一にするには、supplier_idでレンジ・パーティション化され、partnumでハッシュ・サブパーティション化されたコンポジット・レンジ - ハッシュ・パーティション表を選択します。
複数列のパーティション表にパーティション・バウンドを定義する場合、いくつかのルールに従う必要があります。たとえば、3つの列a、bおよびcでレンジ・パーティション化された表があるとします。個々のパーティションには、次のようなレンジ値があります。
P0(a0, b0, c0) P1(a1, b1, c1) P2(a2, b2, c2) ... Pn(an, bn, cn)
各パーティションに指定するレンジ値は、次のルールに準拠している必要があります。
a0はa1以下で、a1はa2以下である必要があります(以降同様)。
a0=a1の場合、b0はb1以下である必要があります。a0 < a1の場合、b0およびb1は任意の値でかまいません。a0=a1かつb0=b1の場合、c0はc1以下である必要があります。b0<b1の場合、c0およびc1は任意の値でかまいません(以降同様)。
a1=a2の場合、b1はb2以下である必要があります。a1<a2の場合、b1およびb2は任意の値でかまいません。a1=a2かつb1=b2の場合、c1はc2以下である必要があります。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