2013-06-18 40 views
1

我想创建一个表,并通过范围分区,然后通过散列子分区。但我得到一个错误。我怀疑脚本中出了什么问题。当我们进行范围分区时,我们可以为散列指定不同数量的子分区,如下面的例子(分区OTHER_1有三个子分区,而其他所有分区有两个分区)。Oracle 11g复合分区 - 范围|哈希

CREATE TABLE ACCOUNTHOLDER_P (id INT, purchased DATE, OBJECT_TYPE VARCHAR2(50), PHONE_NUMBER VARCHAR2(50))

PARTITION BY RANGE (OBJECT_TYPE)
SUBPARTITION BY HASH(PHONE_NUMBER) (

PARTITION PARTNER_1 VALUES LESS THAN ('||''''||'Partner%'||''''||') TABLESPACE USERS (  
    SUBPARTITION sp1 TABLESPACE ABC, 
    SUBPARTITION sp2 TABLESPACE ABC 
), 

PARTITION CONSUMER_1 VALUES LESS THAN ('||''''||'User%'||''''||') TABLESPACE USERS ( 
    SUBPARTITION sp3 TABLESPACE XYZ, 
    SUBPARTITION sp4 TABLESPACE XYZ 
), 

PARTITION OTHER_1 VALUES LESS THAN (MAXVALUE) TABLESPACE USERS (
    SUBPARTITION sp5 TABLESPACE KLM, 
    SUBPARTITION sp6 TABLESPACE KLM, 
    SUBPARTITION sp7 TABLESPACE KLM 
)); 

错误:

SQL Error: ORA-00907: missing right parenthesis 00907. 00000 - "missing right parenthesis" *Cause:
*Action:

感谢

问候,

时代

+0

请解释为什么VALUES LESS THAN子句对于分区来说太复杂了。你试图分裂什么样的实际价值? – APC

+0

处理撇号/单引号时会带来复杂性。以下理论适用于此。 SELECT'There'|| ''''|| 'Alan'==有Alan谢谢。 – era

回答

3

琐碎...

评论后
KLM, 
^that's the problem 

更新:

检查这些单引号。尚不清楚您是否希望它们属于您的分区值,也是百分比符号。也许代替

PARTITION PARTNER_1 VALUES LESS THAN ('||''''||'Partner%'||''''||') 

,会做你想要什么:第二评论后

PARTITION PARTNER_1 VALUES LESS THAN ('Partner') 

更新:

我只能猜测,你可能会寻找类似的东西:

select '||'''||'User%'||'''||' from dual; 

||'User%'|| 

但是,它只是没有将其用作分区值是有意义的。请解释你想要完成的事情。

+0

对不起。这是我发布正确的SQL的不好之处。我纠正了查询。即使没有这个','我仍然得到同样的错误。 – era

+0

请参阅主要问题下的评论。我正在试图处理撇号/单引号。这就是为什么在这里的复杂性。 – era

3

散列分区和子分区应该总是以2 - 2,4,8,16,32等的权力出现 - 否则最终会导致它们之间的行不均匀分布。

这且不说,还有如何指定哈希子分区数量的文档中的例子 - 我无法想象为什么你要做到这一点http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#i1006565

,虽然。散列分区对于提高大型同等链接的性能很有用,但当连接表具有相同数量的散列分区/子分区时,这是最有效的。

+0

谢谢大卫。我不加入表格。即使在范围分区之后,我对每个分区都有一个大块。所以我决定进一步使用散列进行子分区。根据我的理解,这是正确的,我期待着性能的提高。我不清楚为什么每个分区需要相同数量的子分区。 – era

+0

那么我不知道为什么你会有不同数量的子分区。你如何确定每个分区使用多少个子分区?此外,您希望看到哪种类型的操作可以提高性能,为什么? –