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

Oracle 列表分区表的上限长度约束 (ORA-14116)

askTom 2017-09-05
633

问题描述

亲爱的汤姆,

我们确实有一些表,其中将经常创建分区:
CREATE TABLE partitioned_table 
(
    someUsefulPartitionIndicator NUMBER (*,0),
    someData varchar2(4000)
)
partition by list (someUsefulPartitionIndicator)
(partition p1 values (1));

declare
    i number;
begin
    FOR i IN 2..10000
    LOOP
        execute immediate 'alter table partitioned_table add partition p'||i||' values ('||i||')';    
    END LOOP;
end;
复制



现在-我们确实有一个内务工作,根据我们将访问数据的方式将分区合并为更有用的分区:
declare
    i number;
begin
    FOR i IN 2..5000
    LOOP
        execute immediate 'alter table partitioned_table merge partitions p2,p'||2*i||' into partition p2';
    END LOOP;
END;
复制


不幸的是,这项工作失败了:
ORA-14116: partition bound of partition "P2" is too long
ORA-06512: at line 6
复制


调查分区2条:

select high_value from user_tab_partitions
where partition_name = 'P2'
and table_name = 'PARTITIONED_TABLE'

'1550, 1548, ..., 2'
复制


那根绳子的长度4096。

有什么方法可以绕过这个吗?不幸的是,按范围划分对我们不起作用,因为那时我们失去了对实际合并哪些分区的控制 (只有相邻的可以合并)。

谢谢你的帮助,
菲利普

专家解答

我觉得你在向后解决这个问题。而不是将所有值放在自己的分区中,然后将那些值太少或其他值组合在一起,做相反的事情。

把所有东西都放在一个分区里。然后根据需要从中分离出来。您可以使用默认分区来执行此操作。例如:

create table partitioned_table (
  someusefulpartitionindicator number (*,0),
  somedata varchar2(4000)
)
partition by list (someusefulpartitionindicator)
(partition pdef values (default));

alter table partitioned_table split partition pdef into (
  partition p1 values (1),
  partition p2 values (2),
  partition pdef
);

select partition_name, high_value 
from   user_tab_partitions
where  table_name = 'PARTITIONED_TABLE';

PARTITION_NAME  HIGH_VALUE  
P1              1           
P2              2           
PDEF            default  
复制


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

评论