#performance #oracle11g #sql-delete #bulk
Вопрос:
База данных: Oracle 11g
Сценарий:
- TABLE_A содержит около 50 миллионов записей
- ТАБЛИЦА_А содержит СТОЛБЦА_А, СТОЛБЦА_В, СТОЛБЦА_С, СТОЛБЦА_D, СТОЛБЦА_Е
- COLUMN_A-это первичный ключ ТАБЛИЦЫ_A
Нам нужно удалить около 30 миллионов записей из TABLE_A
Итак, мы создали еще одну таблицу TABLE_B В таблице TABLE_B есть СТОЛБЕЦ_A со всеми идентификаторами, подходящими для удаления из TABLE_A на основе TABLE_A.В таблице COLUMN_A в таблице B есть еще один КЛАССИФИКАТОР столбцов, который заполняется последовательностью, начинающейся с 1 до максимального количества записей, скажем, 30 миллионов.ТАБЛИЦА B также разделена на основе диапазона на основе столбца-КЛАССИФИКАТОРА. Каждый диапазон разбит на 3 миллиона записей
Какой подход из приведенных ниже будет наиболее эффективным способом удаления записей с учетом приведенного выше сценария. Мы планируем выполнить эту задачу в выходные с минимальным временем простоя, а также избежать любых проблем с пространством сегмента из-за массового удаления:
- Подход-I: Используйте инструкцию direct delete без каких-либо условий следующим образом Удалить из TABLE_A, где СТОЛБЕЦ_A в (выберите СТОЛБЕЦ_A из TABLE_B)
Кроме того, можем ли мы использовать параллельные подсказки для повышения производительности:
Delete /* parallel first_rows*/ from TABLE_A where COLUMN_A in (select /* parallel first_rows*/ COLUMN_A from TABLE_B);
- Подход-II: Удалите записи из TABLE_A, разделив данные на основе диапазона количества столбцов КЛАССИФИКАТОРА, чтобы избежать проблем с пространством сегментов, если таковые имеются. А также записи могут быть удалены в итерациях.
Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 1 and 300000); Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 300001 and 600000); Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 600001 and 900000);
и т.д., пока
Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 2700001 and 3000000);
Кроме того, можем ли мы использовать параллельные подсказки в приведенных выше операторах удаления для повышения производительности
- Подход-III: Удалите записи из TABLE_A, разделив данные на основе разделов в TABLE_B
delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_1)); delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_2)); delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_3));
и т.д., пока
delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_10));
Кроме того, можем ли мы использовать параллельные подсказки в приведенных выше операторах удаления для повышения производительности
Существует ли какой-либо другой лучший подход для реализации вышеупомянутого сценария?
Комментарии:
1. Если вы удаляете больше строк, чем сохраняете, я бы просто создал копию таблицы со строками, которые вы хотите сохранить, удалил старую таблицу и переименовал новую таблицу обратно в имя старой таблицы. Вы можете рассмотреть возможность разбиения новой таблицы на разделы, что может упростить удаление данных в будущем, например, если вы разделяете столбец даты и хотите удалить строки, в которых эта дата старше, например, года, вы можете удалить разделы, содержащие строки старше года.
2. Привет, Бонеист, спасибо за помощь.
3. Привет, Бонеист, большое тебе спасибо за помощь. Создание другой таблицы с требуемыми записями-это не тот вариант, который мы ищем, причина в том, что количество сохраненных записей намного больше, чем записей, подлежащих удалению. Кроме того, размер таблицы указан в TBs из-за некоторых данных clob в одном из столбцов, из-за которых другая копия той же таблицы потребляла бы огромное количество места. извините, что упомянул количество записей в table_A как 50 миллионов записей, это был всего лишь пример. Не могли бы вы, пожалуйста, помочь с обзором того, что было бы лучшей оценкой среди упомянутых выше.
4. Единственный способ определить, какой вариант лучше всего подходит для вас и ваших данных, — это протестировать их и выбрать тот, который лучше всего работает в соответствии с вашими требованиями