暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 增加散列子分区的数量

askTom 2016-05-18
329

问题描述

嗨,
我使用的是Oracle 11g企业版数据库。我有一个既有的表,同时具有范围分区和散列子分区。当前,在首次创建表时,子分区的数量被设置为64 ,在不久的将来,我可能需要将该数量增加到更高的值(可能是128 )。下面是表定义中指定分区信息的部分:


PARTITION BY RANGE (RECORD_INS_DATE)
 INTERVAL (Numtodsinterval(1,'day')) 
 SUBPARTITION BY HASH(BUSINESS_ID, SOURCE_SYSTEM, DESTINATION_SYSTEM)
     SUBPARTITIONS 64  
 (PARTITION P_FIRST_PART VALUES LESS THAN (TO_DATE('16-DEC-2015','DD-MON-YYYY')))


2个问题:

1)是否可能不指定子分区的数量,而让oracle在遇到新的散列值时动态创建子分区?

2)如果#1不可能,我是否可以将值从64增加到128 ,而不删除现有表,因为该表包含数据?如果是,我需要使用什么命令?

先谢了。

致以亲切的问候,
PP

专家解答

1.指定的分区数决定了有多少哈希值。如果您说64个哈希分区,则只能有64个哈希值。Oracle无法遇到第65个值。

所以没有。

2、可以修改子分区模板。所有新的分区都将有这么多的散列子分区。这只影响新分区。现有分区的子分区数量仍然相同:

SQL> create table t (
  2    record_ins_date    date, business_id int,
  3    source_system      int, destination_system int
  4  ) partition by range ( record_ins_date )
  5    interval ( numtodsinterval ( 1,'day' ) )
  6    subpartition by hash (
  7      business_id, source_system, destination_system
  8    ) subpartitions 64 (
  9      partition p_first_part values less than (
 10        to_date ( '16-DEC-2015','DD-MON-YYYY' )
 11      )
 12    ) ;

Table created.

SQL>
SQL> select count(*) from user_tab_subpartitions
  2  where  table_name = 'T';

  COUNT(*)
----------
        64

SQL>
SQL> alter table t set subpartition template 128;

Table altered.

SQL>
SQL> /* Existing partition unchanged */
SQL> select count(*) from user_tab_subpartitions
  2  where  table_name = 'T';

  COUNT(*)
----------
        64

SQL>
SQL> insert into t values (sysdate, 1, 1, 1);

1 row created.

SQL>
SQL> /* 128 subpartitons for new partition (192-64 = 128)*/
SQL> select count(*) from user_tab_subpartitions
  2  where  table_name = 'T';

  COUNT(*)
----------
       192


如果要向现有分区添加更多的子分区,则需要显式添加它们:

SQL> alter table t modify partition p_first_part add subpartition p65;

Table altered.

SQL> alter table t modify partition p_first_part add subpartition p66;

Table altered.

SQL>
SQL> select count(*) from user_tab_subpartitions
  2  where  table_name = 'T';

  COUNT(*)
----------
       194

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论