通过指定 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
----------------------------------------------------------------------------
 Append  (cost=0.00..14.35 rows=1 width=250)
   ->  Seq Scan on sales_q3_2012  (cost=0.00..14.35 rows=1 width=250)
         Filter: ((sale_year = '2012'::numeric) AND (sale_month = '8'::numeric))
(3 rows)

由于其 sale_month 列的值为 8 且 sale_year 列的值为 2012 的所有行都将存储在 q3_2012 分区中,因此 POLARDB for Oracle 将仅搜索该分区。