次の例では、どのサプライヤがどの部品を配送するかに関する情報が格納されている表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