коррелированные проблемы с производительностью удаления - PullRequest
0 голосов
/ 29 ноября 2018

В моей БД Access (внутри приложения C #) у меня изначально был такой запрос:

DELETE 
FROM ModelRule 
WHERE RuleID NOT IN (SELECT RuleID FROM Rule)

С правилами 700К это невыносимо медленно.Поэтому я прибег к циклу C #:

foreach ( DataRow row in dtRulesToPurge.Rows ) {
    [pseudocode:] "DELETE FROM ModelRule WHERE RuleID = " + row["ID"];
    [pseudocode:] Give user feedback/progressbar/counts
}

Кажется, что foreach быстрее, но в основном (по крайней мере) я могу дать обратную связь пользователям через индикатор выполнения.Этот подход занимает минуты.Коррелированный подзапрос занимает как минимум минут , но я всегда сдавался и убивал его до того, как он действительно закончился - я подозреваю, что это занимает больше времени.

НО у меня в голове немного щекотки, которая говорит:может быть БЫСТРЫЙ способ сделать это удаление с помощью лучшего подзапроса или какого-либо соединения, и т. д., который будет намного лучше, чем любой из моих двух подходов выше.

Хотелось бы услышать ваши мысли.

1 Ответ

0 голосов
/ 29 ноября 2018

Я предпочитаю NOT EXISTS, поэтому я бы написал:

DELETE FROM ModelRule 
WHERE NOT EXISTS (SELECT 1
                  FROM Rule
                  WHERE ModelRule.RuleID  = RULE.RuleID
                 );

Тогда для производительности вам нужен индекс на RULE(RuleID).

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