雖然真的很討厭SQL,但是只要從事web開發的多多少少都會碰到,實在是無法避免。最近碰到了SQL從一個table取資料去update另一個table的效能問題,最初的寫法是這樣的:
UPDATE NEW_DATA N
SET N.A_COLUMN = (
SELECT O.A_COLUMN
FROM OLD_DATA O
WHERE O.ID = N.ID)
)
這樣的寫法跑了大概半個小時都還沒跑完(一共4萬多筆資料),最後受不了把他停下來,改成以下寫法:
UPDATE (
SELECT N.A_COLUMN NEW_A,
O.A_COLUMN OLD_A
FROM NEW_DATA N, OLD_DATA O
WHERE O.ID = N.ID
)
SET NEW_A = OLD_A
結果不到兩分鐘就跑完了~原因是第二種寫法會先將兩個table依select條件join成一個暫存的view,這個view再用自己的資料對自己做update,而不是像第一種寫法一樣每寫一筆資料之前都要先查詢一次。
Partition
Select ID, GROUP
From (
Select ID,
GROUP,
Row_Number() Over (Partition By GROUP Order By Abs(ID) Desc) Sequence
-- 針對同一個GROUP的資料依ID大小排序,並給定序號
From DATA
) TEMP
WHERE TEMP.SEQUENCE = 1
-- 只取出每個GROUP最大ID的資料