是否有一种非常有效的方法从SQLite表中删除不在另一个SQLite表中的记录?

时间:2019-02-06 16:40:49

标签: sql sqlite

我有两个表:Phrase和PhraseSource。两者的结构相同,但是当我将数据下载到PhraseSource时,有时行数可能会减少。我不想更改短语的内容,但是我想删除不再存在的那些行。这是我正在使用的并且有效:

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

但是,这两个表中都有很多行。有没有更有效的删除方法?

3 个答案:

答案 0 :(得分:1)

有时候我相信 Format Module Mode Description ------------------------------------------------------------------------------- 3FR DNG r-- Hasselblad CFV/H3D39II 3G2 MPEG r-- Media Container 3GP MPEG r-- Media Container AAI* AAI rw+ AAI Dune image AI PDF rw- Adobe Illustrator CS2 ART* ART rw- PFS: 1st Publisher Clip Art ARW DNG r-- Sony Alpha Raw Image Format AVI MPEG r-- Microsoft Audio/Visual Interleaved AVS* AVS rw+ AVS X image BGR* BGR rw+ Raw blue, green, and red samples ... ... HEIC* HEIC rw- High Efficiency Image Format <--- THERE IT IS

magick identify -verbose SomeImage.HEIC

答案 1 :(得分:1)

删除很多行可能会很昂贵。我先将其写为exists

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

这可以处理PhraseSource(PhraseId)上的索引。可能就足够了。

如果不是,则可能是真正的问题是删除操作的开销。为了解决这个问题,您需要使用一个临时表。

答案 2 :(得分:0)

您可以分批执行,拥有执行服务,并使用多个线程向其提交查询,查询将变得像这样

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

batchsize和nextBatchIndex是您可以用来获得所需优化的参数