如何使此更新查询更有效

时间:2014-06-18 10:31:46

标签: sql sqlite

我正在使用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行。

非常欢迎任何改进此查询的建议。

1 个答案:

答案 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)上创建索引。