2013-05-17 66 views
1

我正在修改一個現有語句,該語句在一個表中加入用戶信息,以便用戶信息可以來自另一個表。一個是永久表,另一個是臨時表(記錄從一個移動到另一個)。我將我的聯合更改爲左聯接,然後離開加入了第二個聯繫信息表。如果它存在,我需要選擇永久字段,如果永久字段不存在,我需要選擇臨時字段。 154306是我正在選擇的主表上所有傳入記錄的用戶標識。這裏是我的2個選項選擇字段:DB2 Performance CASE vs COALESCE

SELECT 

CASE WHEN U.USRID = 154306 
    THEN T.TMPFNAME 
    ELSE U.FNAME 
END AS FNAME, 

COALESCE (U.LNAME, T.TMPLNAME) AS LNAME 

FROM FILES.ORDERS O 
LEFT JOIN FILES.USERS U ON U.USRID <> 154306 AND U.USRID = O.ORDUSR 
LEFT JOIN FILES.TMPUSERS T ON O.ORDNUM = T.TMPORD 

我想的情況似乎更「正確」的,因爲它是實際控制流量,但由於聚結有較少的邏輯遵循它可能會執行得更快。要麼完成相同的結果,因爲剩下的兩個連接可以確保我們能夠獲取用戶的信息,但是不會獲得仍然分配給臨時用戶的訂單的永久用戶信息。看起來我們有10個字段可以合併/合併,所以我認爲性能更好的方法就是要走的路,我認爲這是合併的,但我甚至不確定。出於任何原因,哪種方法更好?

+0

當你嘗試時發生了什麼? –

+0

1次通話的表現並不重要,它是在網站上實時顯示負載可以測試的時間。 – MaKR

回答

3

casecoalesce()的性能對連接三個大型表的查詢不會產生影響。這種查詢主要由讀取和匹配表中的行的時間決定。

順便說一下,這兩個不是,正好是一樣。如果users.Fname中的值爲NULL,那麼case邏輯會保留它們,但coalesce()邏輯會填充另一個表中的值。

您的準則應該是表達的清晰。因爲你認爲case更有意義,所以我建議你去那個。

+0

謝謝,這很有幫助。顯然他們錯誤地告訴我 - 記錄不會從溫度轉移到永久性,它們被複制,而不是一直被複制。我們只是要使用coalesce,以便抓住所有可能的信息。很高興知道這對未來,雖然:) – MaKR