使用INSERT OR REPLACE后跟SELECT会有任何性能损失吗?

时间:2016-10-26 09:14:52

标签: sql sqlite

我有两个表,PhraseId是两者中的主键,Modified是自1970年以来的秒数。修改是数据加载的一部分,但不是必需的,除非它使更新更容易。如果我没有它,那么我只想使用INSERT OR REPLACE

UPDATE

PhraseSource表包含5010行(一些新行和一些更改的行) Phrase表包含5000行。我想用PhraseSource中的新行和更改行更新Phrase表。请注意,我的应用程序不需要显示已修改的数据,但它是为了便于插入或更新而添加的。

这是我想出的。如果这是进行更新和插入的好方法,您能告诉我吗?

PhraseSource with columns PhraseId, Text, Modified
Phrase       with columns PhraseId, Text, Modified

如果有更好的方法可以做到这一点(也许使用包含自1970年以来在源上最后一次修改行的秒数的修改后的列),那么我也非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

5000行什么都不是;你可以删除并复制整个表格。

如果要最小化写入的更改量,可以使用Modified列轻松完成此操作:首先删除所有较旧的行,然后复制所有新行:

DELETE FROM Phrase
WHERE Modified < (SELECT Modified
                  FROM PhraseSource
                  WHERE PhraseId = Phrase.PhraseId);

INSERT OR IGNORE INTO Phrase(PhraseId, Text, Modified)
SELECT PhraseId, Text, Modified FROM PhraseSource;

没有Modified,可以通过比较实际值来完成同样的事情:

DELETE FROM Phrase
WHERE Text IS NOT (SELECT Text
                   FROM PhraseSource
                   WHERE PhraseId = Phrase.PhraseId);

INSERT OR IGNORE INTO Phrase(PhraseId, Text)
SELECT PhraseId, Text FROM PhraseSource;