我正在使用SQLite3。 任何人都可以看到如何使这个查询更有效率? 基本上,我有一个表,我用一个给定的InsertDate插入一些记录。 该表可能已包含新插入记录的重复项(在其他4个字段上)。我想更新所有重复项中的某个字段
要查找重复的行,我使用此查询(为清晰起见,标识符已更改)
SELECT Table1.rowid
FROM Table1
INNER JOIN
(
SELECT Field1, Field2, Field3, Field4, InsertDate
FROM Table1
WHERE InsertDate = '2013-07-11'
) AS T
ON
T.Field1 = Table1.Field1
AND T.Field2 = Table1.Field2
AND T.Field3 = Table1.Field3
AND T.Field4 = Table1.Field4
WHERE Table1.InsertDate <> T.InsertDate --(could use WHERE Table1.InsertDate <> '2013-07-11')
选择查询需要6s才能在字段1,2和3上运行索引(有趣的是我发现在Field4上有一个索引将时间增加到9s所以我没有一个)
然后我在更新查询中使用该查询,通过在更新语句中使用选择跟随IN子句来决定要更新哪些记录,即
UPDATE Table 1
SET Field 5 = 'A'
WHERE Table1.RowID IN
-- here comes the original select query
(
SELECT Table1.rowid
FROM Table1
INNER JOIN
(
SELECT FIELD1, Field2, Field3, Field4, InsertDate
FROM Table1
WHERE InsertDate = '2013-07-11'
) AS T
ON
T.Field1 = Table1.Field1
AND T.Field2 = Table1.Field2
AND T.Field3 = Table1.Field3
AND T.Field4 = Table1.Field4
WHERE Table1.InsertDate <> T.InsertDate
)
但这需要将近25秒才能运行!
我尝试从初始SELECT中创建一个临时表,打算在更新查询中使用它,但是这也需要大约25秒来制作表格,因此它看起来不像实际的更新那样&#39;减慢了速度,看起来使用我的6s选择查询&#39; IN&#39;。
通常我会更新大约300,000个中的9000行。
非常欢迎任何改进此查询的建议。
答案 0 :(得分:1)
如果我理解逻辑正确,则不需要rowid
:
UPDATE Table 1
SET Field 5 = 'A'
WHERE InsertDate <> '2013-07-11' and
EXISTS (select 1
from table1 tt
where tt.InsertDate = '2013-07-11' and
T.Field1 = tt.Field1 and
T.Field2 = tt.Field2 and
T.Field3 = tt.Field3 and
T.Field4 = tt.Field4
);
然后,在table1(field1, field2, field3, field4, insertdate)
和table1(insertdate)
上创建索引。