这是对 Range-Hash 分区的正确解释吗?

Posted

技术标签:

【中文标题】这是对 Range-Hash 分区的正确解释吗?【英文标题】:Is this a correct explanation of a Range-Hash partition? 【发布时间】:2020-05-07 20:47:56 【问题描述】:
CREATE TABLE sales
  ( prod_id       NUMBER(6)
  , cust_id       NUMBER
  , time_id       DATE
  , channel_id    CHAR(1)
  , promo_id      NUMBER(6)
  , quantity_sold NUMBER(3)
  , amount_sold   NUMBER(10,2)
  )
 PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id)
  SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4)
 ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))
 , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))
 , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
 , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
 );

在上面的示例中,创建了一个范围哈希分区并将数据库分成四个部分,ts1、ts2、ts3、ts4。然后创建一个范围分区,将每个销售季度的数据分成四个部分(ts1、ts2、ts3、ts4)。即使将销售季度划分为分区(ts1、ts2、ts3、ts4),这些数据又进一步分为8个子分区?

如果有帮助,这是我用于示例的网站:https://docs.oracle.com/database/121/VLDBG/GUID-A596B6B1-62C7-4701-A872-BDC5632CEE43.htm

谢谢

【问题讨论】:

【参考方案1】:

几乎。我发现这个例子实际上很混乱,必须在理解之前对其进行测试。

该表被拆分为分区 sales_q1_2006 ... sales_q4_2006。 2006 年第一季度的time_id 位于分区 sales_q1_2006 等中。每个分区由列 cust_id 的哈希值分成 8 个子分区。

现在,(ts1, ts2, ts3, ts4) 位。如果为 8 个子分区使用 8 个表空间,则更容易理解:

   SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4, ts5, ts6, ts7, ts8)

如果创建表,则 8 个子分区中的每一个都存储在单独的表空间中:

SELECT partition_position AS pos, partition_name, subpartition_name, tablespace_name 
  FROM USER_TAB_SUBPARTITIONS 
 ORDER BY table_name, partition_position, subpartition_name;

POS PARTITION     SUBPARTITION TABLESPACE
1   SALES_Q1_2006 SYS_SUBP525  TS1
1   SALES_Q1_2006 SYS_SUBP526  TS2
1   SALES_Q1_2006 SYS_SUBP527  TS3
1   SALES_Q1_2006 SYS_SUBP528  TS4
1   SALES_Q1_2006 SYS_SUBP529  TS5
1   SALES_Q1_2006 SYS_SUBP530  TS6
1   SALES_Q1_2006 SYS_SUBP531  TS7
1   SALES_Q1_2006 SYS_SUBP532  TS8
2   SALES_Q2_2006 SYS_SUBP533  TS1
2   SALES_Q2_2006 SYS_SUBP534  TS2
2   SALES_Q2_2006 SYS_SUBP535  TS3
...

所以,所有分区的第一个哈希子分区都存储在表空间ts1中,所有分区的第二个哈希子分区存储在表空间ts2中,以此类推,直到表空间ts8。

回到您的示例,有 4 个表空间名称和 8 个子分区:四个指定的表空间 ts1 到 ts4 只是循环通过,直到所有子分区都有一个表空间。在您的示例中,8 个子分区转到表空间 ts1、ts2、ts3、ts4、ts1、ts2、ts3 和 ts4:

SELECT partition_position AS pos, partition_name, subpartition_name, tablespace_name 
  FROM USER_TAB_SUBPARTITIONS 
 ORDER BY table_name, partition_position, subpartition_name;

POS PARTITION       SUBPARTITION   TABLESPACE
1   SALES_Q1_2006   SYS_SUBP589    TS1 <= first cycle
1   SALES_Q1_2006   SYS_SUBP590    TS2
1   SALES_Q1_2006   SYS_SUBP591    TS3
1   SALES_Q1_2006   SYS_SUBP592    TS4
1   SALES_Q1_2006   SYS_SUBP593    TS1 <= next cycle
1   SALES_Q1_2006   SYS_SUBP594    TS2
1   SALES_Q1_2006   SYS_SUBP595    TS3
1   SALES_Q1_2006   SYS_SUBP596    TS4
2   SALES_Q2_2006   SYS_SUBP597    TS1 <= next partition
2   SALES_Q2_2006   SYS_SUBP598    TS2
2   SALES_Q2_2006   SYS_SUBP599    TS3
...

【讨论】:

以上是关于这是对 Range-Hash 分区的正确解释吗?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle基础 表分区

有谁能给我今年的NOIP分区联赛的题目?

Oracle分区表

MySQL中的分区表

日期分区或日期分片

我想按姓氏对表进行分区? [关闭]