使用表达式按列表分区

时间:2013-10-25 16:13:54

标签: sql oracle oracle11g partitioning

我想以一种我总是知道记录去向的方式对表进行分区。例如,如果我有一个电话清单和10个分区,我想引导每个电话号码根据它的最后一位数来指导。

值得一提的是我使用的是Oracle 11gR2

然而,

PARTITION BY LIST似乎不允许这样做。

CREATE TABLE t (
    tel INT NOT NULL
)
PARTITION BY LIST ( MOD (tel,10) )
      (PARTITION MSISDN0 VALUES (0),
       PARTITION MSISDN1 VALUES (1),
       PARTITION MSISDN2 VALUES (2),
       PARTITION MSISDN3 VALUES (3),
       PARTITION MSISDN4 VALUES (4),
       PARTITION MSISDN5 VALUES (5),
       PARTITION MSISDN6 VALUES (6),
       PARTITION MSISDN7 VALUES (7),
       PARTITION MSISDN8 VALUES (8),
       PARTITION MSISDN9 VALUES (9));

Erro de SQL: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"

LIST PARTITIONS似乎不接受功能。我仍然使用虚拟列进行管理:

CREATE TABLE t (
    tel INT NOT NULL
    , tel_p GENERATED ALWAYS AS ( mod (tel,10) )
)
PARTITION BY LIST ( tel_p )
      (PARTITION MSISDN0 VALUES (0),
       PARTITION MSISDN1 VALUES (1),
       PARTITION MSISDN2 VALUES (2),
       PARTITION MSISDN3 VALUES (3),
       PARTITION MSISDN4 VALUES (4),
       PARTITION MSISDN5 VALUES (5),
       PARTITION MSISDN6 VALUES (6),
       PARTITION MSISDN7 VALUES (7),
       PARTITION MSISDN8 VALUES (8),
       PARTITION MSISDN9 VALUES (9));

虽然感觉相当不稳定...... 有没有“正确的方法”来做到这一点?

1 个答案:

答案 0 :(得分:3)

我认为你做的方式 是正确的方式 。您可以在Oracle文档中具体了解该功能:

  

基于虚拟列的分区

     

在Oracle数据库的早期版本中,表格只能是   如果分区键实际存在于表中,则进行分区。   在Oracle Database 11g中,虚拟列删除了该限制   允许分区键由表达式定义,使用一个   或更多表的现有列。表达式存储为   仅元数据。

     

Oracle分区已得到增强,可以实现分区策略   在虚拟列上定义。例如,一个10位数的帐户ID   可以包括帐户分支信息作为前3位数。同   基于虚拟列的分区扩展,一个ACCOUNTS表   包含ACCOUNT_ID列可以使用虚拟扩展   (派生)列ACCOUNT_BRANCH,派生自前三个   ACCOUNT_ID列的数字,它将成为分区键   对于这张桌子。

     

所有基本支持基于虚拟列的分区   分区策略,包括interval和interval- * composite   分区。

来源:Oracle Documentation - Partitioning