oracle使用多列分区键

本文深入探讨了数据库中的多列分区表,特别是在使用范围分区和散列分区时如何确定分区键。举例说明了如何根据年、月和日的独立列创建多列分区,并展示了不同日期插入记录时如何匹配到对应的分区。分区键的评估遵循从左到右的顺序,只有当前面的列无法唯一确定分区时,才会考虑后续的列。此外,当遇到MAXVALUE时,后续列的值不再重要。
摘要由CSDN通过智能技术生成

对于范围分区表和散列分区表,最多可以指定16个分区键列。当分区键由几列组成,并且后续列定义的粒度比前几列更高时,使用多列分区。最常见的场景是分解的DATETIMESTAMP键,由年、月和日的独立列组成。

在计算多列分区键时,只有当第一个值不能唯一标识单个目标分区时,数据库才使用第二个值,只有当第一个值和第二个值不能确定正确的分区时,数据库才使用第三个值,依此类推。只有当分区界限与某个值完全匹配,并且为下一个分区定义了相同的界限时,该值才能确定正确的分区。仅当多列键的所有前(n-1)个值与分区的(n-1)个界限完全匹配时,才调查第n列。例如,只有当第一列与分区边界值完全匹配时,才会计算第二列。如果所有列值都与某个分区的所有绑定值完全匹配,则数据库会确定该行不适合该分区,并考虑下一个分区进行匹配。

对于不确定的边界定义(至少一列具有相同值的连续分区),分区边界值成为包含值,表示“小于或等于”边界。这与确定性边界相反,在确定性边界中,值总是被视为“小于”边界。

例1 说明了一个多列区域分区表的列求值,将实际DATE信息存储在三个独立的列中:yearmonthday。分区粒度是一个日历季度。被评估的分区表是按如下方式创建的:

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)界限或(MAXVALUEMAXVALUE)界限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值