繁体   English   中英

如何使此更新查询更有效

[英]How can I make this update query more efficient

我正在使用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秒钟,因此它看起来不像它的实际更新那样使速度变慢,它看起来像是用我的6s选择查询加上“ IN”。

通常,我将在大约300,000中更新大约9000行。

任何改进此查询的建议都将受到欢迎。

如果我正确理解逻辑,则不需要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)上创建索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM