Существует ли очень эффективный способ удаления записей из таблицы SQLite, которых нет в другой таблице SQLite? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две таблицы: Phrase и PhraseSource.Оба имеют одинаковую структуру, но возможно, что при загрузке данных в PhraseSource иногда может быть меньше строк.Я не хочу изменять содержимое фразы, но я хотел бы удалить те строки, которые больше не существуют.Вот то, что я использую, и это работает:

DELETE FROM Phrase WHERE PhraseId NOT IN (SELECT PhraseId FROM PhraseSource)

Однако в обеих этих таблицах имеется большое количество строк.Есть ли более эффективный способ удаления?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Иногда я верю в NOT EXISTS:

DELETE 
FROM Phrase
WHERE NOT EXISTS (SELECT 1 FROM PhraseSource PS WHERE PS.PhraseId = Phrase.PhraseId);
0 голосов
/ 06 февраля 2019

Удаление большого количества строк может быть дорогим.Я бы начал с записи этого как exists:

DELETE FROM Phrase
    WHERE NOT EXISTS (SELECT 1 PhraseSource ps WHERE phrase.PhraseId = ps.PhraseId);

Это может позаботиться об индексе на PhraseSource(PhraseId).Этого, вероятно, достаточно.

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

0 голосов
/ 06 февраля 2019

Вы можете сделать это партиями, иметь службу исполнителя и отправить запрос к нему с несколькими потоками, и запрос станет чем-то вроде этого

DELETE FROM Phrase WHERE PhraseId NOT IN (SELECT PhraseId FROM PhraseSource limit batchSize offset nextBatchIndex)

Где batchsize и nextBatchIndex - параметры, которые вы можете воспроизводитьс, чтобы получить нужную оптимизацию

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