使用UNIQUE ON CONFLICT IGNORE提高SQLITE UPSERT性能的原因是什么?

时间:2013-03-20 12:22:24

标签: sqlite

使用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)

每100000个UPSERTS通过BEGIN TRANSACTION和END TRANSACTION包装1,500,000个UPSERTS,测试#1需要10个小时才能完成。
每100000个由BEGIN TRANSACTION和END TRANSACTION包装的1,500,000个UPSERTS UPSERTS,测试#2需要18分钟才能完成。

请问SQLITE UPSERT UNIQUE ON CONFLICT IGNORE 巨大性能提升的原因是什么?

1 个答案:

答案 0 :(得分:1)

sqlite-users.org专家刚回答了为什么CREATE TABLE UNIQUE ON CONFLICT IGNORE比CREATE UNIQUE INDEX快得多的问题。

检查OR REPLACE部分是否在第二种情况下有效 - Count是否按预期增加。我怀疑,ON CONFLICT IGNORE条款,事实上可能会忽略冲突。然后它工作

要快得多,因为它写的次数要少得多。

Igor Tandetnik