2013-06-18 2 views
1

Я пытаюсь создать таблицу и разбить ее по диапазону, затем подраздел хэшем. Но я получаю сообщение об ошибке. Я сомневаюсь, что в скрипте не так. Когда мы делаем раздел диапазона, мы можем указать другое количество подсетей для хэша, как показано ниже в моем примере (раздел OTHER_1 имеет три подраздела, а все остальные разделы имеют два).Oracle 11g Композитный раздел - Диапазон | Hash

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' || '' '' || 's Alan' == Есть Алан Спасибо. – era

ответ

3

тривиальна ...

KLM, 
^that's the problem 

Update после комментария:

Проверить эти одиночные кавычки. Неясно, хотите ли вы, чтобы они принадлежали вашему значению разметки, а также знак процента. Может быть, вместо того, чтобы

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

, что будет делать именно то, что вы хотите:

PARTITION PARTNER_1 VALUES LESS THAN ('Partner') 

Update после 2 комментария:

Я могу только догадываться, что вы могли бы искать что-то вроде этого:

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

||'User%'|| 

Однако, это просто не имеет смысл использовать это как значение разделения. Пожалуйста, объясните, что вы пытаетесь выполнить.

+0

Извините. Мне плохо писать правильный SQL. Я исправил запрос. Даже без этого »,« я все еще получаю ту же ошибку. – era

+0

Пожалуйста, напишите мой комментарий по основному вопросу. Я пытаюсь разобраться с апострофами/одинарными кавычками. Вот почему здесь сложность. – era

3

Хэш-перегородки и подразделы должны всегда иметь силу двух - 2, 4, 8, 16, 32 и т. Д. - или вы получаете неравномерное распределение строк между ними.

Это в стороне, есть пример в документации о том, как указать количество хэш подразделов - http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#i1006565

Я не могу себе представить, почему вы хотите сделать это, хотя. Разделы хэша полезны для повышения производительности больших эквитианов, но это наиболее эффективно, когда таблицы объединения имеют одинаковое количество хэш-разделов/подсетей.

+0

Спасибо, Дэвид. Я не присоединяюсь к столам. Даже после разделения диапазона у меня есть большой кусок для каждого раздела. Поэтому я решил продолжить подсегмент с использованием хэша. В моем понимании это правильно, и я ожидаю улучшения производительности.Я не понимаю, почему каждый раздел нуждается в равном количестве подразделений. – era

+0

Ну, я не уверен, почему у вас будет разное количество подразделений. Как вы определяете, сколько подсетей использовать для каждого раздела? Кроме того, с какой операцией вы ожидаете увидеть улучшение производительности и почему? –

Смежные вопросы