使用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
巨大性能提升的原因是什么?
答案 0 :(得分:1)
sqlite-users.org专家刚回答了为什么CREATE TABLE UNIQUE ON CONFLICT IGNORE比CREATE UNIQUE INDEX快得多的问题。
检查OR REPLACE部分是否在第二种情况下有效 - Count是否按预期增加。我怀疑,ON CONFLICT IGNORE条款,事实上可能会忽略冲突。然后它工作
Igor Tandetnik