Стратегия Oracle Auto Partition в столбце Integer - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужна помощь в том, как выполнить автоматическое разбиение столбца с целыми числами, аналогично тому, как мы делаем в столбце с датой, например PARTITION BY RANGE (DIM_DT_ID) INTERVAL (NUMTODSINTERVAL(1,'DAY')).

У меня 90 миллионов строк, и это отстой в производительности, а наш SLA по запросу составляет 2 секунды, я хотел бы выполнить разбиение. Каков наилучший подход и как включить автоматическое разбиение в столбце целых чисел

Наш запрос всегда будет фильтроваться по таким столбцам, как

select * from <tbname> 
where ObjectID =1346785 
and patentnumber=23456.

1 Ответ

0 голосов
/ 01 мая 2018

«Я просто делаю пример здесь, так как не могу вставить исходный запрос ради законности»

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

Вставленный запрос будет работать хорошо с составным индексом и, вероятно, выиграет от сжатия ведущего столбца:

 create index your_table_lookup_index 
      on your_table(ObjectID, patentnumber) compress 1;

Если это уникальная комбинация, сделайте индекс уникальным.

как включить автоматическое разбиение в столбце целых чисел

Однако, если вы считаете, что у вас есть подлинный вариант использования для разбиения на разделы, тогда мы можем использовать разделение на интервалы с целыми числами, а также с датами. Этот оператор создаст таблицу, разделенную на objectid с разделением для каждых десяти значений.

create table your_table (
      objectid   number,
      patentnumber        number,
      created_date date
)
partition by range (objectid)
interval (10)
(
   partition p_00010 values less than (10)
);

В ваших опубликованных данных это будет около 400 разделов с примерно 225000 строк на раздел. Это хороший выбор? Кто может подсказать? Вы знаете свои данные и свои варианты использования, а мы нет: возможно, лучше будет раздел на objectid (то есть с interval (1)).

У вас уже есть таблица, поэтому вам нужно разбить ее на разделы. Стандартный способ сделать это будет

  1. создайте новую таблицу с вашей стратегией разделения (как выше), но с разделом по умолчанию в диапазоне values less than (MAXVALUE)
  2. использовать обмен разделами, чтобы переместить существующие данные таблицы в новый структура
  3. удалить старую таблицу и переименовать таблицу в старую таблицу; разрешить внешние ключи и другие зависимости.
  4. итеративно разбивает раздел на требуемый диапазон

Это довольно трудоемкий процесс. Вы отметили свой вопрос [oracle12c]; Если вы используете Oracle 12c R2, вам определенно стоит взглянуть на механизм онлайн-конвертации, который представляет собой одну команду. Узнать больше .

Помните, что разделение на части для производительности - сложная игра. Хотя он может улучшить запросы, которые возвращают большое количество строк, выровненных по ключу раздела, он может не иметь никакого значения для других запросов или даже ухудшать их производительность. В частности, любой запрос, который не включает ключ разделения (objectid в вашем случае), вероятно, будет работать хуже после разбиения таблицы.


Окончательно в стороне: как вы знаете, но в интересах будущих искателей, разделение является платной доплатой к лицензии Enterprise Edition. Нам не разрешено использовать его, если мы не заплатили за него.

...