SQL NOT IN или NOT EXISTS оператор неэффективен - PullRequest
0 голосов
/ 08 марта 2019

Фон

У меня есть две таблицы - одна обновляется каждый день новыми данными (несобственный крайний срок), а одна постоянно добавляется и удаляется из зависимости от другой (оперативная таблица).

Способ, которым это работает, заключается в том, что, если распределенные рабочие места появляются в таблице «неисполненных сроков», то добавьте в таблицу «вживую». Если на следующий день занятых лиц нет в таблице «неисполненных сроков», удалите из таблицы «вживую».

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

Проблема, с которой я сталкиваюсь, заключается в том, что часть кода удаления, кажется, выполняется более 3000 строк и возвращает около 300 просто отлично, но выполнение этого оператора SQL занимает более 4 минут и 30 секунд. Каков наиболее эффективный способ написания этого заявления? Мой инстинкт инстинкта говорит мне, что эти два утверждения различны, и объединение их является проблемой.

DELETE FROM [LiveTable]
WHERE [WorkID] NOT IN (SELECT [WorkID]
                       FROM [FailedDeadline])
   OR [LiveTable].[EmployeeID] <> (SELECT [EmployeeID]
                                   FROM [FailedDeadline] as fd
                                   WHERE [LiveTable].[WorkID] = fd.[WorkID]);

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Я бы сформулировал это следующим образом:

DELETE lt FROM [LiveTable] lt
WHERE NOT EXISTS (SELECT 1
                  FROM FailedDeadline fdl
                  WHERE fdl.WorkID = lt.WorkID AND
                        lt.EmployeeID = fdl.EmployeeID
                 );

Это одно условие фиксирует, что в таблице с ошибками не существует записи с тем же идентификатором сотрудника.

Затем требуется индексна FailedDeadline(WorkId, EmployeeID).

1 голос
/ 08 марта 2019

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

DELETE LT
FROM [LiveTable]  LT
LEFT JOIN [FailedDeadLine] FD1 ON LT.WorkID=FD1.WorkID
LEFT JOIN [FailedDeadline] FD2 ON LT.WorkID=FD2.WorkID 
WHERE (FD1.WorkID IS NULL OR LT.EmployeeID<>FD2.EmployeeID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...