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) 

Test #2中,我们使用与Test#1UPSERT相同的方法,

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 个 UPSERTS 由 BEGIN TRANSACTION 和 END TRANSACTION 包裹 1,500,000 个 UPSERTS,测试 #2 需要 18 分钟才能完成。

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

4

1 回答 1

1

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

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

快得多仅仅是因为它的写入次数要少得多。

伊戈尔·坦德尼克

于 2013-03-20T16:17:38.270 回答