Массовое удаление (требуется 2 объединения) без разбиения - PullRequest
1 голос
/ 26 октября 2011

Я испытываю бесконечный цикл для удаления. Я пробовал много способов справиться с этой проблемой, но все еще занимал слишком много времени. Я постараюсь быть максимально понятным.

У меня есть 4 таблицы с этой проблемой.

Удаление выполняется в зависимости от указанного pool_id

Table 1 contain the pool_id
Table 2 the ticket_id foreign join ticket_pool_id with the pool_id
Table 3 ticket_child_id foreign join ticket_id with the ticket_id
Table 4 ticket_grand_child_id foreign ticket_child_id join with the ticket_child_id

Concerned count for each
table 1---->1
table 2---->1 200 000
table 3---->6 300 000
table 4---->6 300 000

Так что на самом деле это 6,3M + 6,3M + 1,2M + 1 строка, которую нужно удалить

Вот ограничение:

  • Нет разделения
  • Oracle версия 9
  • Онлайн все время, поэтому нет времени простоя и CTAS
  • Мы не можем использовать каскадное ограничение
  • Нормализация очень важна

Вот что я попробовал:

  • Массовое удаление
  • Удалить с оператором (предложение In и Exists)
  • временная таблица для каждого уровня и 1 уровень соединения
  • процедура и фиксация каждые 20k

Никто из них не работал в достойные сроки, например, менее часа. Тот факт, что мы не можем основывать удаление на одном из значений столбца, не помогает. Есть ли способ?

1 Ответ

1 голос
/ 26 октября 2011

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

...