[英]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.