Производительность разделов Oracle

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

Проблема в том, что есть некоторые запросы, которые выполняют полное сканирование индекса и выполняются очень часто, например, 300 раз в секунду. Раньше запрос раздела занимал около 0,15 секунды, но после раздела он занимал от 0,50 до 1,25 секунды. Кто-нибудь знает, что разделение таблицы оракула снижает производительность запроса? Если да, то не могли бы вы указать причину? Кажется, есть некоторые статьи, но они недостаточно ясны для меня, чтобы понять.


person Anil    schedule 06.08.2017    source источник


Ответы (2)


Если индекс является локальным и запрос основан не на ключе разделения (это означает, что сокращение раздела невозможно), а является высокоизбирательным, усилия будут увеличиваться пропорционально количеству созданных вами разделов. Если у вас 30 разделов, то для ваших значений нужно искать 30 индексов. Тот факт, что каждый индекс меньше, не компенсируется большим количеством индексов. (Возможно, вы захотите посмотреть, как работают индексы btree, чтобы понять, почему это не так).

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

person fhossfel    schedule 06.08.2017
comment
хороший ответ, но я думаю, что возникает новая проблема: когда раздел удаляется, это влияет на глобальный индекс. - person miracle173; 06.08.2017
comment
Спасибо @fhossfel, я проверю - person Anil; 06.08.2017
comment
Да, глобальный индекс необходимо перестроить, это может занять некоторое время. Вы можете указать пункт обновления индексов, чтобы сделать это при удалении / усечении разделов. - person Wernfried Domscheit; 06.08.2017

Если у вас есть таблица разделов и если у вас много запросов на выборку в этой таблице, всегда включайте в предложение WHERE Paritioncoloumn =value.

пример, если раздел основан на столбце типа дата (PERSISTED_DATE)

Запрос

SELECT * FROM TABLE_NAME WHERE COLOUMN1='VALUE' and trunc(PERSISTED_DATE)=trunc(sysdate);

Важные моменты, на которые следует обратить внимание.

  1. Избегайте использования глобального индекса, если это высокая транснациональная таблица, иначе вам придется построить глобальный индекс после удаления раздела.
  2. Для повышения производительности уменьшите количество разделов, вы можете автоматизировать создание нового раздела и удаление старого раздела на ежедневной основе.
person SantoshPawar    schedule 17.05.2018