我有两个表:Phrase和PhraseSource。两者的结构相同,但是当我将数据下载到PhraseSource时,有时行数可能会减少。我不想更改短语的内容,但是我想删除不再存在的那些行。这是我正在使用的并且有效:
DELETE FROM Phrase WHERE PhraseId NOT IN (SELECT PhraseId FROM PhraseSource)
但是,这两个表中都有很多行。有没有更有效的删除方法?
答案 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是您可以用来获得所需优化的参数