3

我想以一种我总是知道记录去向的方式对表进行分区。例如,如果我有一个电话列表和 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));

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

4

1 回答 1

3

我认为你的做法是正确的。您可以在 Oracle 的文档中详细了解该功能:

基于虚拟列的分区

在 Oracle 数据库的早期版本中,只有当分区键物理存在于表中时,才能对表进行分区。在 Oracle 数据库 11g 中,虚拟列消除了该限制,并允许使用表的一个或多个现有列由表达式定义分区键。表达式仅存储为元数据。

Oracle 分区已得到增强,允许在虚拟列上定义分区策略。例如,一个 10 位数的帐户 ID 可以包括帐户分行信息作为前 3 位数字。通过基于虚拟列的分区的扩展,包含 ACCOUNT_ID 列的 ACCOUNTS 表可以使用从 ACCOUNT_ID 列的前三位数字派生的虚拟(派生)列 ACCOUNT_BRANCH 进行扩展,该列成为该表的分区键。

所有基本分区策略都支持基于虚拟列的分区,包括间隔和间隔-* 复合分区。

来源:Oracle 文档 - 分区

于 2013-10-25T17:16:51.117 回答