Предложите способ удаления небольших данных из огромной таблицы в Oracle - PullRequest
1 голос
/ 13 февраля 2012

У меня есть таблица с 300 миллионами строк. Мне нужно удалить около 3 миллионов из него. У меня нет никакого индекса в этой таблице. Данные будут удалены на основе определенной даты столбца. Нравится

delete from table where column_name = '1-dec-2010' 

Что было бы лучшим решением для этого?

  1. Индексируйте столбец и выполняйте удаление.
  2. Сохранить таблицу как есть, т.е. удалить без использования индекса

Использование индекса будет использовать сканирование индекса + накладные расходы на обновление индекса после удаления. Без индекса будет использоваться полное сканирование таблицы. Так есть ли какой-нибудь порог, который говорит, что после X миллионов строк индекс предпочтительнее полного сканирования таблицы?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

У вас есть следующие опции (в порядке эффективности):

  1. Разметка. Дополнительный вариант для Enterprise Edition. Если данные разделены по дням, то удаление данных за данный день так же просто, как удаление раздела дня. Быстро, эффективно, красиво, но дорого (если клиент не может получить хорошие скидки).

  2. Создайте новую таблицу и скопируйте данные, которые вы хотите сохранить, в новую таблицу (используйте прямую вставку пути). Оставьте старый стол; переименуйте новую таблицу (или используйте динамически управляемые синонимы). Индекс может быть полезен в этом случае, хотя более вероятно, что Oracle проигнорирует это, так как селективность не является хорошей (необходимо получить доступ только к 1% данных; оптимизатор может подумать, что с индексом не стоит иметь дело). См. Комментарии Тома Кайта к этой опции.

  3. Использовать индекс. Это определенно ускорит поиск записей, которые необходимо удалить, но удаление все равно будет мучительно медленным (повтор и все).

0 голосов
/ 13 февраля 2012

Ну, вы удаляете фиксированный 1% ваших данных? Если это так, а разбиение не рассматривается, выполните следующие действия:

  1. Создайте свой индекс по столбцу даты.
  2. Убедитесь, что статистика оптимизатора собрана для этого индекса и для таблицы.

Запустите запрос, подобный следующему:

* * 1010
  • LEAF_BLOCKS дает приблизительный размер «блоков данных» индекс.
  • CLUSTERING_FACTOR говорит вам, сколько будет табличных операций ввода / вывода требуется прочитать всю таблицу по этому индексу.
  • BLOCKS дает вам размер таблицы в блоках.

Если CLUSTERING_FACTOR очень близко к размеру BLOCKS, то таблица более или менее сохраняется в порядке, в котором находится индекс.

Итак, если вы удаляете 1% таблицы, посмотрите, что меньше:

BLOCKS или ((LEAF_BLOCKS + CLUSTERING_FACTOR) / 100)

Если BLOCKS значительно больше - вероятно, в 10 раз больше - чем вычисленное выражение, то индекс, вероятно, ускорит удаление.

...