对于范围分区表和散列分区表,最多可以指定16个分区键列。当分区键由几列组成,并且后续列定义的粒度比前几列更高时,使用多列分区。最常见的场景是分解的DATE
或TIMESTAMP
键,由年、月和日的独立列组成。
在计算多列分区键时,只有当第一个值不能唯一标识单个目标分区时,数据库才使用第二个值,只有当第一个值和第二个值不能确定正确的分区时,数据库才使用第三个值,依此类推。只有当分区界限与某个值完全匹配,并且为下一个分区定义了相同的界限时,该值才能确定正确的分区。仅当多列键的所有前(n-1)个值与分区的(n-1)个界限完全匹配时,才调查第n列。例如,只有当第一列与分区边界值完全匹配时,才会计算第二列。如果所有列值都与某个分区的所有绑定值完全匹配,则数据库会确定该行不适合该分区,并考虑下一个分区进行匹配。
对于不确定的边界定义(至少一列具有相同值的连续分区),分区边界值成为包含值,表示“小于或等于”边界。这与确定性边界相反,在确定性边界中,值总是被视为“小于”边界。
例1 说明了一个多列区域分区表的列求值,将实际DATE
信息存储在三个独立的列中:year
、month
和day
。分区粒度是一个日历季度。被评估的分区表是按如下方式创建的:
CREATE TABLE sales_demo (
year NUMBER,
month NUMBER,
day NUMBER,
amount_sold NUMBER)
PARTITION BY RANGE (year,month)
(PARTITION before2001 VALUES LESS THAN (2001,1),
PARTITION q1_2001 VALUES LESS THAN (2001,4),
PARTITION q2_2001 VALUES LESS THAN (2001,7),
PARTITION q3_2001 VALUES LESS THAN (2001,10),
PARTITION q4_2001 VALUES LESS THAN (2002,1),
PARTITION future VALUES LESS THAN (MAXVALUE,0));
REM 12-DEC-2000
INSERT INTO sales_demo VALUES(2000,12,12, 1000);
REM 17-MAR-2001
INSERT INTO sales_demo VALUES(2001,3,17, 2000);
REM 1-NOV-2001
INSERT INTO sales_demo VALUES(2001,11,1, 5000);
REM 1-JAN-2002
INSERT INTO sales_demo VALUES(2002,1,1, 4000);
year
的字段值12-DEC-2000
, 满足第一个分区before2001
,因此无需进一步评估:
SELECT * FROM sales_demo PARTITION(before2001);
YEAR MONTH DAY AMOUNT_SOLD
---------- ---------- ---------- -----------
2000 12 12 1000
17-MAR-2001
的存储在分区q1_2001
中。第一个分区键列year
本身不能确定正确的分区,因此必须计算第二个分区键列month
。
SELECT * FROM sales_demo PARTITION(q1_2001);
YEAR MONTH DAY AMOUNT_SOLD
---------- ---------- ---------- -----------
2001 3 17 2000
按照与前一条记录相同的确定规则,第二列month
将分区q4_2001
确定为1-NOV-2001
的正确分区:
SELECT * FROM sales_demo PARTITION(q4_2001);
YEAR MONTH DAY AMOUNT_SOLD
---------- ---------- ---------- -----------
2001 11 1 5000
01-JAN-2002
的分区,是通过只计算year列来确定的,这里指的是future
分区:
SELECT * FROM sales_demo PARTITION(future);
YEAR MONTH DAY AMOUNT_SOLD
---------- ---------- ---------- -----------
2002 1 1 4000
如果数据库在一个分区键列中遇到MAXVALUE
,那么后续列的所有其他值都变得无关紧要。也就是说,在前面的示例中,具有(MAXVALUE
,0)界限的分区future
的定义等效于(MAXVALUE
,100)界限或(MAXVALUE
,MAXVALUE
)界限。