Sql 如何使此更新查询更高效
我正在使用SQLite3。 有人知道如何使这个查询更有效吗? 本质上,我有一个表,在其中插入一些具有给定InsertDate的记录。 该表可能已经包含与新插入的记录重复的4个其他字段。我想更新所有这些副本中的某个字段 为了找到重复的行,为了清晰起见,我使用了这个查询标识符Sql 如何使此更新查询更高效,sql,sqlite,Sql,Sqlite,我正在使用SQLite3。 有人知道如何使这个查询更有效吗? 本质上,我有一个表,在其中插入一些具有给定InsertDate的记录。 该表可能已经包含与新插入的记录重复的4个其他字段。我想更新所有这些副本中的某个字段 为了找到重复的行,为了清晰起见,我使用了这个查询标识符 SELECT Table1.rowid FROM Table1 INNER JOIN ( SELECT Field1, Field2, Field3, Field4, InsertDate
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')
使用字段1、2和3上的索引运行select查询需要6秒有趣的是,我发现在字段4上有索引会将时间增加到9秒,所以我没有索引
然后,我在update查询中使用该查询,通过在update语句ie中的in子句后面添加select来决定更新哪些记录
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秒的时间来运行
我试着用初始选择创建一个临时表,打算在更新查询中使用它,但也花了大约25秒来创建这个表,所以看起来不像是实际的更新减慢了速度,它似乎在使用我的6s选择查询和“in”
通常我会更新大约300000行中的9000行
任何改进此查询的建议都将非常受欢迎。如果我正确理解了逻辑,您不需要rowid:
然后,在table1field1、field2、field3、field4、insertdate和table1insertdate上创建一个索引。谢谢,这似乎会把它放到4s
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
);