2013年2月19日 星期二

[SQL] SQL tuning 奇技淫巧 (in Oracle)

雖然真的很討厭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的資料