簡體   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