Удалить записи с запросом корреляции в Oracle - PullRequest
0 голосов
/ 20 октября 2019

У меня есть таблица с пользователями и адресами.
Мне нужно удалить все записи из таблицы, где несколько разных пользователей связаны с одним и тем же адресом.
Итак, я подготовил следующий запрос:

DELETE FROM MYTABLE A 
WHERE EXISTS (
    SELECT USER_ID 
    FROM MYTABLE B 
    WHERE A.ADDRESS = B.ADDRESS AND B.USER_ID > A.USER_ID
)

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

Может кто-нибудь подтвердить, если это так? Вообще, является ли это верным способом достижения цели в Oracle?

Версия oracle 12.1.

Спасибо,

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Это немного длинно для комментария.

1) Невозможно определить причину медлительности, которую вы видите, без предоставления дополнительных данных.

2) Однако,когда дело доходит до удаления дубликатов, решение, которое обычно имеет хорошую производительность в Oracle, заключается в использовании коррелированного подзапроса с ANY. Я бы выступил за следующий запрос:

DELETE FROM MYTABLE A
WHERE A.USER_ID > ANY (SELECT USER_ID FROM MYTABLE B WHERE A.ADDRESS = B.ADDRESS)

Для этого запроса (и для вашего тоже) рассмотрите индекс по (USER_ID, ADDRESS ).

1 голос
/ 20 октября 2019

Если вы хотите удалить все строки, в которых есть дубликаты, я могу предложить:

DELETE FROM MYTABLE A 
WHERE A.ADDRESS IN (SELECT A2.ADDRESS
                    FROM MYTABLE A2
                    GROUP BY A2.ADDRESS
                    HAVING COUNT(DISTINCT A2.USER_ID) > 1
                   );

Подзапрос должен быть оценен один раз. Индекс на (ADDRESS, USER_ID) будет полезен для запроса.

Если вы хотите сохранить минимальный идентификатор пользователя (что не так, как вы говорите, но кажется разумным), тогда я бы предложил:

DELETE FROM MYTABLE A 
WHERE A.USER_ID > (SELECT MIN(A2.USER_ID)
                    FROM MYTABLE A2
                    WHERE A2.ADDRESS = A.ADDRESS
                   );

Для этого полезен тот же индекс.

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