Как я могу улучшить производительность этого оракула SQL-запрос на удаление? - PullRequest
1 голос
/ 12 марта 2012

Мне нужно удалить некоторые нежелательные строки из таблицы на основе результата запроса на выборку из другой таблицы

DELETE /*+ parallels(fe) */  FROM fact_x fe
WHERE fe.key NOT IN(
  SELECT DISTINCT di.key
  FROM dim_x di
  JOIN fact_y fa
  ON fa.code         = di.code
  WHERE fa.code_type = 'ABC'
 );

Внутренний запрос на выборку возвращает 77 строк и выполняется за несколько миллисекунд. но внешний запрос на удаление выполняется вечно (более 8 часов). Я попытался подсчитать, сколько строк нужно удалить, преобразовав значение delete в select count (1) и его примерно 66,4 миллиона строк fact_x из общего числа 66,8 миллионов строк. Я не пытаюсь усечь, хотя. Мне нужно сохранить оставшиеся строки.

Есть ли другой способ добиться этого? Будет ли удаление этого с помощью курсора pl / sql работать лучше?

Ответы [ 3 ]

7 голосов
/ 12 марта 2012

Не имеет ли больше смысла просто вставить строки, которые вы хотите сохранить, в другую таблицу, а затем удалить существующую таблицу?Даже если есть FK для отключения / воссоздания / и т.д.это почти наверняка будет быстрее.

1 голос
/ 12 марта 2012

Не могли бы вы добавить столбец "toBeDeleted"? Запрос для установки, который не будет нуждаться в этой конструкции "NOT IN". Удаление отмеченных строк также должно быть «простым».

Опять же, удаление 99,4% из 67 миллионов строк займет некоторое время.

0 голосов
/ 13 марта 2012

Попробуйте / * + Параллельно (например) * /.Нет "S".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...