Я керую програмою, яка має дуже велику кількість (майже 1 ТБ даних з більш ніж 500 мільйонами рядків в одній таблиці). База даних насправді нічого не робить (ні SProcs, ні тригери, ні щось), це лише сховище даних.
Щомісяця від нас вимагається очищення записів із двох основних таблиць. Критерії очищення різняться і являють собою поєднання віку рядка та пари полів статусу. Зазвичай ми чистимо від 10 до 50 мільйонів рядків на місяць (ми додаємо приблизно 3-5 мільйонів рядків на тиждень за допомогою імпорту).
В даний час ми повинні зробити це видалення партіями приблизно в 50 000 рядків (тобто. Видалити 50000, comit, видалити 50000, ввести, повторити). Спроба видалити всю партію за один раз робить базу даних невідповідною протягом приблизно години (залежно від кількості рядків). Видалення рядків такими партіями є дуже грубим у системі, і ми зазвичай мусимо робити це "як дозволяє час" протягом тижня; дозволяючи сценарію постійно працювати, може призвести до зниження продуктивності, неприйнятного для користувача.
Я вважаю, що такий тип пакетного видалення також погіршує продуктивність індексу та має інші впливи, які з часом спричиняють погіршення продуктивності бази даних. Всього в одній таблиці є 34 індекси, а розмір даних індексу насправді більший, ніж самі дані.
Ось сценарій, який використовує один з наших ІТ-людей для цього очищення:
BEGIN
LOOP
delete FROM tbl_raw
where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000;
exit when SQL%rowcount < 49999;
commit;
END LOOP;
commit;
END;
Ця база даних повинна перевищувати 99,99999%, і ми маємо лише 2-денне вікно обслуговування один раз на рік.
Я шукаю кращого методу для видалення цих записів, але ще не знайшов жодного. Будь-які пропозиції?