2016-10-26 7 views
0

私は2つのテーブルを持っていますが、PhraseIdは両方のプライマリキーです。Modifiedは1970年以降の秒数です。変更はデータロードの一部ですが、更新が容易でないと必須ではありません。私はそれなしで行うことができる場合、私はちょうどINSERTを使用するか、PhraseSourceテーブルは5010行(いくつかの新しいといくつか変更された行) フレーズテーブルは5000行が含まれているが含まれていINSERT OR REPLACEに続けてSELECTを使用すると、パフォーマンス上のペナルティはありますか?

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

REPLACEしたいと思います。 PhraseSourceの新しい行と変更された行でPhraseテーブルを更新したいと思います。私のアプリケーションでは、変更されたデータを表示する必要はありませんが、挿入や更新を簡単に行うために追加されています。

ここで私が思いついたのです。これが更新と挿入を行う良い方法であるかどうか教えてください。

INSERT OR REPLACE INTO Phrase(PhraseId, Text) 
SELECT PS.PhraseId, PS.text FROM PhraseSource AS PS 

この(おそらく行がソースで最後に変更された1970年からの秒数が含まれているmodifedカラムを使用)を行うには良い方法があれば、私も非常に多くの任意の提案をいただければ幸いです。

+0

をちょうど競合がある場合、古い行を削除し、非常に多くの実際の変更がない場合でも、それはテーブル全体を書き換えるREPLACE。 –

答えて

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; 
関連する問題