RANGEパーティションテーブルに複数のキー列を指定することで、パフォーマンスを向上させることができます。
少数の列セットに対して (より大きい値またはより小さい値に基づく) 比較演算子を使用して行を頻繁に選択する場合は、RANGEパーティション分割ルールでこれらの列を使用することを検討してください。
レンジパーティションテーブルで複数のキー列を指定する
レンジパーティションテーブル定義は、パーティションキーに複数の列を含むことができます。 範囲パーティション分割されたテーブルに複数のパーティションキー列を指定するには、partition BY range句:
CREATE TABLE sales
(
dept_no number,
part_no varchar2,
country varchar2(20),
sale_year number,
sale_month number,
sale_day number,
amount number
)
PARTITION BY RANGE(sale_year, sale_month)
(
PARTITION q1_2012
VALUES LESS THAN(2012, 4),
PARTITION q2_2012
VALUES LESS THAN(2012, 7),
PARTITION q3_2012
VALUES LESS THAN(2012, 10),
PARTITION q4_2012
VALUES LESS THAN(2013, 1)
);テーブルに複数のパーティションキー列がある場合、テーブルをクエリするときに複数のキー値を指定して、パーティションプルーニングを最大限に活用する必要があります。
acctg=# EXPLAIN SELECT * FROM sales WHERE sale_year = 2012 AND sale_month = 8;
QUERY PLAN
----------------------------------------------------------------------------- Result (cost=0.00..14.35 rows=2 width=250)
-> Append (cost=0.00..14.35 rows=2 width=250)
-> Seq Scan on sales (cost=0.00..0.00 rows=1 width=250)
Filter: ((sale_year = 2012::numeric) AND (sale_month = 8::numeric))
-> Seq Scan on sales_q3_2012 sales (cost=0.00..14.35 rows=1 width=250)
Filter: ((sale_year = 2012::numeric) AND (sale_month = 8::numeric))
(6 rows)sale_month列の値が8で、sale_year列の値が2012であるすべての行は、q3_2012パーティションに格納されます。 は、このパーティションのみを検索します。