1

SQLITE UPSERTでパフォーマンスが向上する理由は何UNIQUE ON CONFLICT IGNOREですか?

テスト#1では、

CREATE TABLE FREQMARY(
VALUE CHAR(40),NUMERICVALUE FLOAT, DATETIMEVALUE CHAR(40), COUNT INT, LENGTH INT) 

CREATE UNIQUE INDEX IX_MARY ON FREQMARY(VALUE).

テスト#1では、次のUPSERTを使用します。

INSERT OR REPLACE INTO FREQMARY(Value, NumericValue, DateTimeValue, Count, Length) 
VALUES ('Braintree Road',NULL,NULL, COALESCE((SELECT Count+1 FROM FREQMARY WHERE Value='Braintree Road'), 1),14)

テスト#2では、

CREATE TABLE FREQMARY(
VALUE CHAR(40) UNIQUE ON CONFLICT IGNORE ,NUMERICVALUE FLOAT, DATETIMEVALUE CHAR(40), COUNT INT, LENGTH INT) 

テスト#2では、テスト#1と同じUPSERTものを使用します。

INSERT OR REPLACE INTO FREQMARY(Value, NumericValue, DateTimeValue, Count, Length) 
VALUES ('Braintree Road',NULL,NULL, COALESCE((SELECT Count+1 FROM FREQMARY WHERE Value='Braintree Road'), 1),14)

100000UPSERTSごとにBEGINTRANSACTIONとENDTRANSACTIONでラップされた1,500,000UPSERTSを使用すると、テスト#1の完了には10時間かかります。
100000UPSERTSごとにBEGINTRANSACTIONとENDTRANSACTIONでラップされた1,500,000UPSERTSを使用すると、テスト#2の完了には18分かかります。

パフォーマンス がSQLITE UPSERT 大幅に向上した理由を教えてUNIQUE ON CONFLICT IGNOREください。

4

1 に答える 1

1

sqlite-users.orgの専門家は、CREATE TABLE UNIQUE ONCONFLICTIGNOREがCREATEUNIQUEINDEXよりもはるかに高速である理由についての質問に答えました。

2番目のケースでORREPLACEパーツが実際に機能するかどうか、つまりカウントが期待どおりにインクリメントされるかどうかを確認します。ON CONFLICT IGNORE句を使用すると、実際には競合が無視される可能性があると思います。その後、それは動作します

書き込みがはるかに少ないという理由だけで、はるかに高速になります。

イゴール・タンデトニック

于 2013-03-20T16:17:38.270 に答える