Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Не могу партиционировать таблицу  [new]
MinistrBob
Member

Откуда: Москва
Сообщений: 281
Хочу из непартиционированной таблицы сделать партиционорованную.

Переименовываю старую таблицу

rename APP_APPLICATIONS to APP_APPLICATIONS_OLD

и создаю новую

CREATE TABLE APP_APPLICATIONS
(
  ID             NUMBER(20)                     NOT NULL,
  NO             VARCHAR2(30 BYTE),
  R_DATE         DATE                           NOT NULL,
  DOC_DESC       VARCHAR2(2000 BYTE)            NOT NULL,
  RECEIPT        VARCHAR2(1 BYTE)               DEFAULT 'Н'                   NOT NULL,
  SUBJECT        VARCHAR2(2000 BYTE)            NOT NULL,
  REG_PERIOD     NUMBER(3)                      NOT NULL,
  REMARK         VARCHAR2(2000 BYTE),
  REP_ID         NUMBER(20),
  ENT_ID         NUMBER(20),
  S_REG_ID       NUMBER(20)                     NOT NULL,
  JUR_REG_ID     NUMBER(20),
  INSERTED       DATE                           DEFAULT sysdate               NOT NULL,
  INSERTED_BY    NUMBER(20)                     NOT NULL,
  UPDATED        DATE,
  UPDATED_BY     NUMBER(20),
  DEPT_ID        NUMBER(20),
  REG_AMOUNT     NUMBER(3),
  E_PLAN_DATE    DATE                           NOT NULL,
  VOL_ID         NUMBER(20)                     NOT NULL,
  VOL_REC_NO     NUMBER(20)                     NOT NULL,
  APP_SUBJ_TYPE  NUMBER(8)
)
PARTITION BY RANGE (R_DATE) 
(  
  PARTITION APP_APPLICATIONS_2000 VALUES LESS THAN (TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_2001 VALUES LESS THAN (TO_DATE(' 2001-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_2002 VALUES LESS THAN (TO_DATE(' 2002-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_2003 VALUES LESS THAN (TO_DATE(' 2003-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_2004 VALUES LESS THAN (TO_DATE(' 2004-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_2005 VALUES LESS THAN (TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_2006 VALUES LESS THAN (TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_TEMP VALUES LESS THAN (TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
)

В старой таблице 271031 строк

select count(*) from APP_APPLICATIONS_old
--271031

Проверяю что все данные в таблице соответствуют условию партиции APP_APPLICATIONS_TEMP

select count(*) from APP_APPLICATIONS_old where r_date<to_date('01.01.2010','DD.MM.YYYY')
--271031

Пытаюсь перебросить все данные из старой таблицы во временную партицию APP_APPLICATIONS_TEMP

alter table APP_APPLICATIONS exchange partition APP_APPLICATIONS_TEMP with table APP_APPLICATIONS_old

и получаю

ORA-14099: all rows in table do not qualify for specified partition

В чем я не прав ???
10 май 06, 18:05    [2649364]     Ответить | Цитировать Сообщить модератору
 Re: Не могу партиционировать таблицу  [new]
El gato 40
Member

Откуда:
Сообщений: 50
ORA-14099: строки таблицы APP_APPLICATIONS_old не подходят для партиции APP_APPLICATIONS_TEMP (ибо должны войти в партиции ...2000 - ...2006)

необходимо сделать одну партицию для текущих данных, одну для будущего партицирования

PARTITION BY RANGE (R_DATE) 
(  
  PARTITION APP_APPLICATIONS_2006 VALUES LESS THAN (TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  
  PARTITION APP_APPLICATIONS_TEMP VALUES LESS THAN (TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
)

и обмен сделать с партицией PARTITION APP_APPLICATIONS_2006 (при условии что все текущие данные по ключу партицирования попадут только в эту партицию)
10 май 06, 18:34    [2649477]     Ответить | Цитировать Сообщить модератору
 Re: Не могу партиционировать таблицу  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 722
Please read about:
DBMS_REDEFINITION
10 май 06, 18:54    [2649535]     Ответить | Цитировать Сообщить модератору
 Re: Не могу партиционировать таблицу  [new]
MinistrBob
Member

Откуда: Москва
Сообщений: 281
Спасибо El gato 40 надоумил, осознал свою ошибку.

Оставил в таблице одну партицию временную, сделал exchange со старой таблицей (все данные попали во временную партицию), а затем расплитил временную партицию на отдельные рабочии партиции.

Все это партиционирование затевалось в надежде на увеличение производительности. А получился пшик, т.к. для того чтобы работало партиционирование вместо TABLE ACCESS FULL нужно вносить измения в приложение (добавлять усливия по тому столбцу который партиционируем). Так самое интересно когда я просто меняю приложение и добавляю условие, запрос начинает вместо TABLE ACCESS FULL использовать INDEX RANGE SCAN и отрабатывать в 3 раза быстрее без всякого партиционирования. Когда я всётаки партиционировал таблицу и прогнал запрос на ней (пробовал и без индекса и с индексом локальным/глобальным) получилось что по ресурсам (например consistent gets, physical reads) запрос по парт.таблице и INDEX RANGE SCAN очень близки и время выполнения у них отличается сотыми долями сек.

Получается что партиционирование далеко не всегда предпочтительно. Дешевле оптимизировать приложение, т.к. с партиционированием большой гиморой.
11 май 06, 13:53    [2652358]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить