【问题标题】:Exclude values from oracle partition从 oracle 分区中排除值
【发布时间】:2017-01-17 08:12:43
【问题描述】:

我想在 oracle 中使用复合范围列表分区。

使用范围对我来说很清楚。棘手的部分在列表分区上,这就是我的问题所在。

假设我们有一个包含大陆的列。我希望列表分区包含 NOT 欧洲的所有大陆。这里的问题是我无法创建包含除欧洲以外的所有其他大陆的列表分区,因为在某些时候我可能会添加新的大陆。

这样的事情可能吗?

【问题讨论】:

    标签: sql oracle11g database-partitioning


    【解决方案1】:

    来自甲骨文documentation

    使用列表分区,之间没有明显的顺序感 分区。您还可以指定一个默认分区 不映射到任何其他分区的被映射。

    基于上述,您可以创建两个分区,一个用于欧洲,另一个用于其他分区,并将后者设置为默认值。 这样您就可以将欧洲的数据放在一个分区中,而欧洲以外的任何数据都放在默认分区中。

    这是一个例子

    CREATE TABLE sample_regional_sales
          (deptno number, item_no varchar2(20),
           txn_date date, txn_amount number, state varchar2(2))
      PARTITION BY RANGE (txn_date)
        SUBPARTITION BY LIST (state)
          (PARTITION q1_1999 VALUES LESS THAN (TO_DATE('1-APR-1999','DD-MON-YYYY'))
              TABLESPACE tbs_1
             (SUBPARTITION q1_1999_northwest VALUES ('OR', 'WA'),
              SUBPARTITION q1_1999_southwest VALUES ('AZ', 'UT', 'NM'),
              SUBPARTITION q1_1999_northeast VALUES ('NY', 'VM', 'NJ'),
              SUBPARTITION q1_1999_southeast VALUES ('FL', 'GA'),
              SUBPARTITION q1_others VALUES (DEFAULT) TABLESPACE tbs_4
             ),
           PARTITION q2_1999 VALUES LESS THAN ( TO_DATE('1-JUL-1999','DD-MON-YYYY'))
              TABLESPACE tbs_2
             (SUBPARTITION q2_1999_northwest VALUES ('OR', 'WA'),
              SUBPARTITION q2_1999_southwest VALUES ('AZ', 'UT', 'NM'),
              SUBPARTITION q2_1999_northeast VALUES ('NY', 'VM', 'NJ'),
              SUBPARTITION q2_1999_southeast VALUES ('FL', 'GA'),
              SUBPARTITION q2_1999_northcentral VALUES ('SD', 'WI'),
              SUBPARTITION q2_1999_southcentral VALUES ('OK', 'TX')
             ),
           PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-OCT-1999','DD-MON-YYYY'))
              TABLESPACE tbs_3
             (SUBPARTITION q3_1999_northwest VALUES ('OR', 'WA'),
              SUBPARTITION q3_1999_southwest VALUES ('AZ', 'UT', 'NM'),
              SUBPARTITION q3_others VALUES (DEFAULT) TABLESPACE tbs_4
             ),
           PARTITION q4_1999 VALUES LESS THAN ( TO_DATE('1-JAN-2000','DD-MON-YYYY'))
              TABLESPACE tbs_4
          );
    

    source

    【讨论】:

    • Vijayakumar Udupa,我刚刚也带着默认值来了。我一定会试一试并报告我的结果。谢谢!
    • @Stephan 测试成功了吗?
    • 是的,这行得通。尽管与旧表相比,我的查询没有任何性能提升,但这是另一个主题。我目前面临子分区上的分区索引的新问题。谢谢你的回答。
    • 我认为默认子句不会导致性能下降。由于 Oracle 知道分区的基础,只要您的查询提供了分区的关键数据,您应该能够像以前一样获得结果。在这种情况下,主要影响因素是您的索引,而不是基于分区默认值的列表分区。
    • 只要您的查询有像 'continent =[continet name]' 这样的子句,oracle 就会确定它必须选择哪个分区。实际上,结合您的(范围键,列表键)构建索引将提高查询性能。注意:仅分区不会直接提高性能,它有助于轻松管理数据。此外,当您可以直接在分区上运行查询时,oracle 具有功能(如果您可以到达分区名称并以某种方式使其成为查询的一部分)。正如我过去所见,这会带来很多性能优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2021-10-04
    相关资源
    最近更新 更多