УДАЛИТЬ, а НЕ в производительности запроса - PullRequest
0 голосов
/ 16 апреля 2019

У меня следующая структура таблицы:

Пользователи

  • UserId (первичный ключ)
  • UserName

SomeItems

  • SomeId (FK для Users.UserId)
  • SomeItemId (первичный ключ)
  • Имя
  • Другие вещи ...

SomeOtherItems

  • SomeId2 (FK для Users.UserId)
  • SomeOtherItemId (первичный ключ)
  • Имя
  • Другие вещи ...

Я хочу удалить из таблицы Users записи, которых нет в таблицах SomeItems и SomeOtherItems.

Я могу сделать это:

DELETE from Users
FROM Users u
WHERE u.UserId NOT IN
   (SELECT DISTINCT SomeId FROM SomeItems

    UNION

    SELECT DISTINCT SomeId2 FROM SomeOtherItems)

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

Ответы [ 3 ]

6 голосов
/ 16 апреля 2019

Применение отличительных к двум результатам и последующее объединение их (что относится и к третьим отличительным, все требующие сортировки) - не самый эффективный способ проверки существования. Как насчет:

DELETE u
  FROM dbo.Users AS u -- always use schema prefix!
  WHERE NOT EXISTS
  (
    SELECT 1 FROM dbo.SomeItems WHERE SomeId = u.UserId
  )
  AND NOT EXISTS
  (
    SELECT 1 FROM dbo.SomeOtherItems WHERE SomeID2 = u.UserId
  );
2 голосов
/ 16 апреля 2019

простейшим решением может быть просто изменить UNION на UNION ALL

. Эффект этого вы увидите, удалив компонент агрегата потока из плана запроса.

в конце концоввам все равно, если список дублируется

1 голос
/ 16 апреля 2019

Я бы изменил IN для двух объединений, чем проще запрос, тем проще будет оптимизировать ядро.

DELETE from U
FROM Users U
     left join SomeItems S1 on S1.SomeId = U.UserId
     left join SomeOtherItems S2 on S2.SomeID2 = U.UserId
WHERE S1.SomeId is null and S2.SomeID2 is null

Проверка того, что S1.SomeID имеет значение null, означает, что U.UserId отсутствуетна некоторых предметах.То же самое для SomeOtherItems.

Убедитесь, что у вас есть индексы для SomeId и SomeID2 для SomeItems и SomeOtherItems.

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