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

Откуда:
Сообщений: 2868
есть IOT-таблица:

CREATE TABLE t_accs2agra
    (facc                           VARCHAR2(20) NOT NULL,
    fdatechanged                   DATE NOT NULL,
    fagreement                     VARCHAR2(13) NOT NULL,
    fdatatype                      NUMBER(2,0) DEFAULT 1  NOT NULL,
    fdateinserted                  DATE,
    fupdatestatus                  NUMBER(1,0)
  ,
  CONSTRAINT T_ACCS2AGRA_PK
  PRIMARY KEY (facc, fdatechanged))
  ORGANIZATION INDEX
   PCTTHRESHOLD 50
  PCTFREE     10
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  users
  STORAGE   (
    INITIAL     204800
    NEXT        204800
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  1000000
  )
   INCLUDING FUPDATESTATUS OVERFLOW 
  PCTFREE     10
  PCTUSED     40
  INITRANS    1
  MAXTRANS    255
  TABLESPACE  users
  STORAGE   (
    INITIAL     204800
    NEXT        204800
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  100000
  )
необходимо сделать ее партицированной

можно ли сделать так:

1) создать новую IOT-таблицу с условием на вторую колонку primary key:
Partition by range (fdatechanged)
 (PARTITION part_1 VALUES LESS THAN (to_date('01-jan-1995','dd-mon-yyyy')),
 PARTITION part_2 VALUES LESS THAN  (to_date('01-jan-1996', 'dd-mon-yyyy')),
 PARTITION part_3 VALUES LESS THAN  (maxvalue))
2) добавить существующую таблицу (DDL которой приведен выше) как PARTITION новой (она полностью войдет в ее PARTITION part_1) без INSERT INTO из одной в другую?

как это сделать грамотно?
25 янв 07, 09:58    [3691164]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Nuri
Member

Откуда: Архангельск
Сообщений: 625
exchange partition
25 янв 07, 10:02    [3691198]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Nuri
Member

Откуда: Архангельск
Сообщений: 625
а затем split partition
25 янв 07, 10:03    [3691202]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
спасибо!
а что происходит, если split partition делит существующую партицию с данными надвое?
для сервера это очень долгая операция по перетаскиванию строк из одной партиции в две новых или что-то попроще?
25 янв 07, 10:37    [3691476]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
Alexus12
спасибо!
а что происходит, если split partition делит существующую партицию с данными надвое?
для сервера это очень долгая операция по перетаскиванию строк из одной партиции в две новых или что-то попроще?


Из одной партиции в две новых.

SQL> create table test
  2  (
  3   n number
  4  ) partition by range (n)
  5  (
  6   partition n_all values less than (maxvalue)
  7  );

Table created.

SQL> insert into test values (-1);

1 row created.

SQL> insert into test values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> select rowid
  2   from test;

ROWID
------------------
AAAhs7AAEAAAAASAAA
AAAhs7AAEAAAAASAAB

SQL> alter table test split partition n_all at (0)
  2  into (partition n_0, partition n_all);

Table altered.

SQL> select rowid
  2   from test;

ROWID
------------------
AAAhs8AAEAAAAAWAAA
AAAhs9AAEAAAAAaAAA

оба rowid сменились.
25 янв 07, 10:47    [3691555]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
спасибо, операция прошла успешно

но есть еще одна таблица

CREATE TABLE t_accs2agrb
    (facc                           VARCHAR2(20) NOT NULL,
    fdatefrom                      DATE,
    fdateto                        DATE,
    fagreement                     VARCHAR2(13) NOT NULL)
для которой нет поля с датой для партицирования
т.к. 99% значений fdatefrom и fdateto равны одному (граничному) значению

поля facc и fagreement также не дают хорошего ключа - даже если сделать 100 партиций, все равно со временем они перерастут несколько Гб

при этом изредка происходят insert/delete, меняющие даты, но не facc и fagreement

имеет ли в этом случае смысл партицировать по hash?
тогда в случае необходимости добавить несколько партиций будет полная перестройка всех данных?

или же лучше основаться на substr(facc) или substr(fagreement)?
возможно ли вообще такое? и что лучше?
25 янв 07, 17:35    [3695158]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
givanov
Member

Откуда:
Сообщений: 757
Возможно партиционировать по RANGE(facc) ... LESS THEN '1' ... LESS THEN '2' и т.п.
Но какие-то не те цели Вы преследуете.
25 янв 07, 18:20    [3695462]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
здесь цель - перейти с перестройки одного огромного индекса по facc на перестройку его фрагментов. цель верная?
26 янв 07, 11:27    [3697924]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
и еще вопрос: если split partition делит существующую партицию с данными надвое - много ли данных журналируется/пишется в redo? или это достаточно простая операция для ORACLE?
26 янв 07, 11:41    [3698062]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
givanov
Member

Откуда:
Сообщений: 757
Цель все еще не ясна. У Вас задача перестроить индекс один раз, или Вы делаете это регулярно?
Если вам важен только индекс - можно только его секционировать.
26 янв 07, 12:34    [3698483]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
уточнение: это таблица "ручное материализованное представление" за наличием отсутствия опции fast update для join aggregate matview в ORACLE 8.1.7, а полный пересчет в 1000 раз медленнее ручного обновления 0,1% записей

в таблице происходят вставки (неск тыс записей/день) и удаления (десяток записей в день)
таблица уже доросла до 500 Мб

цель: мнимальное потребление ресурсов на перестройку индексов и возможно применение partition pruning

вопросы:
а) возможно ли деление по таким условиям (строки неравной длины):
partition by (facc)
VALUES LESS '4',
VALUES LESS '408',
VALUES LESS '40820',
VALUES LESS '455',
VALUES LESS '45508',
VALUES LESS '9',

б) сортировка varchar2, содержащего цифры, аналогичина сортировке number?
то есть строка '4081079854466'<'40820' и она попадет во 2 партицию выше?

в) что менее затратно для сервера (redo/rollback/...):
создать пустую партицированную таблицу и сделать в нее INSERT данных (получив две копии одних данных, да)
или
создать пустую партицированную таблицу, добавить непартицированные данные как партицию и начать делить как ALTER TABLE SPLIT?

в2) если split partition делит существующую партицию с данными надвое - много ли данных журналируется/пишется в redo? или это достаточно простая операция для ORACLE?

г) будет ли использоваться partition pruning в случае деления (а), если запрос попросит WHERE facc like '910%'

д) если (г) невозможно, лучше сделать hash? для него существует partition pruning?

что будет с сервером, если таблица разрастется и нужно будет разделить каждую из hash партиций надвое (в2)?
26 янв 07, 13:05    [3698777]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
givanov
Member

Откуда:
Сообщений: 757
>> в таблице происходят вставки (неск тыс записей/день) и удаления (десяток записей в день таблица уже доросла до 500 Мб

Это совсем не много.

>> цель: мнимальное потребление ресурсов на перестройку индексов и возможно применение partition pruning

А есть что экономить? Сейчас индексы тормозят процесс?

>> вопросы:
>> а) возможно ли деление по таким условиям (строки неравной длины):
>> partition by (facc)
>> VALUES LESS '4',
>> VALUES LESS '408',
>> VALUES LESS '40820',
>> VALUES LESS '455',
>> VALUES LESS '45508',
>> VALUES LESS '9',

Да.

>> б) сортировка varchar2, содержащего цифры, аналогичина сортировке number?
>> то есть строка '4081079854466'<'40820' и она попадет во 2 партицию выше?
SQL> select * from dual where '4081079854466'<'40820';

DUMMY
-----
X
>> в) что менее затратно для сервера (redo/rollback/...):
>> создать пустую партицированную таблицу и сделать в нее INSERT данных (получив две копии одних данных, да)
>> или
>> создать пустую партицированную таблицу, добавить непартицированные данные как партицию и начать делить как ALTER TABLE SPLIT?

IMHO пофиг

>> в2) если split partition делит существующую партицию с данными надвое - много ли данных журналируется/пишется в redo? или это достаточно простая операция для ORACLE?

Да, все данные перекладываются, redo - много, операция дорогая, но жить можно.

>> г) будет ли использоваться partition pruning в случае деления (а), если запрос попросит WHERE facc like '910%'

Да, но проверьте.

>> д) если (г) невозможно, лучше сделать hash? для него существует partition pruning?

Нет.

>> что будет с сервером, если таблица разрастется и нужно будет разделить каждую из hash партиций надвое (в2)?[/quot]

Просто напишите сктрипт, который ночью все разделит надвое
26 янв 07, 13:34    [3699000]     Ответить | Цитировать Сообщить модератору
 Re: Partitioning  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
спасибо, а как со статистикой для партиций?
нужно ли собирать для отдельно партиции после заливки данных в нее, если индекс локальный?
а если глобальный?
30 янв 07, 12:57    [3712522]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить