2011-01-26 121 views
0

差異更好的代碼開發

select CE1.CLASS_ID, 
     CE1.LOCATION_ID, 
     count(case CE1.FORMAT_ID when 5 then 1 end) as LIVE, 
     count(case CE1.FORMAT_ID when 14 then 1 end) as LB, 
     count(case CE1.FORMAT_ID when 15 then 1 end) as WEB, 
     SUM(DECODE (CE1.ROLE_ID,5,1,0)) FACULTY, 
     SUM(DECODE (CE1.ROLE_ID ,2,1,0)) MODERATOR, 
     SUM(DECODE (CE1.ROLE_ID ,3,1,0)) PANELIST, 
     SUM(DECODE (CE1.ROLE_ID,4,1,0)) PRESENTER, 
     COUNT(CE1.USER_ID) TOT 
    from C_EDUCATION1 CE1 
GROUP BY CE1.LOCATION_ID, CE1.CLASS_ID 

我們正在開發現有系統和我們發現混合使用COUNT和解碼。 如果我們理解正確,我們可以轉換爲以下代碼。

select CE1.CLASS_ID, 
     CE1.LOCATION_ID, 
     SUM(DECODE (CE1.FORMAT_ID ,5,1,0)) LIVE, 
     SUM(DECODE (CE1.FORMAT_ID ,14,1,0)) LB, 
     SUM(DECODE (CE1.FORMAT_ID,15,1,0)) WEB, 
     SUM(DECODE (CE1.ROLE_ID,5,1,0)) FACULTY, 
     SUM(DECODE (CE1.ROLE_ID ,2,1,0)) MODERATOR, 
     SUM(DECODE (CE1.ROLE_ID ,3,1,0)) PANELIST, 
     SUM(DECODE (CE1.ROLE_ID,4,1,0)) PRESENTER, 
     COUNT(CE1.USER_ID) TOT 
    from C_EDUCATION1 CE1 
GROUP BY CE1.LOCATION_ID, CE1.CLASS_ID 

OR 所有COUNT

我們想知道在其他性能問題上的分歧,或。 更好的方式存在嗎?

+5

我不知道使用CASE與DECODE之間的性能差異,但CASE是ANSI,因此如果DECODE被換出爲CASE,查詢將更具可移植性。我會考慮將DECODE棄用,但爲了向後兼容,它永遠不會消失。 – 2011-01-26 17:21:40

回答

4

兩者之間沒有性能差異。

就個人而言,我傾向於選擇基於CASE的解決方案。 CASE是ANSI標準,而不是Oracle特定的功能。來自其他數據庫平臺的開發人員可能不得不查找DECODE語句的語義。 CASE對於開發者來說也是相當明顯的,無論他們熟悉哪種語言。實際上每種語言都有CASE語句,因此任何開發人員都應該能夠快速瞭解​​您正在做什麼。

話雖這麼說,我會傾向於主張像

SELECT ce1.class_id, 
     ce1.location_id, 
     SUM(CASE WHEN format_pkg.is_live(format_id) = 'Y' THEN 1 ELSE 0 END) live, 
     SUM(CASE WHEN format_pkg.is_lb( format_id) = 'Y' THEN 1 ELSE 0 END) lb, 
     ... 

這使用情況下,從第一個查詢中,SUM從第二,並增加了一些功能的調用,以確定哪些類型的格式/角色正在討論中。這可以防止你必須對整個地方的FORMAT_ID/ROLE_ID值進行硬編碼。而使用SUM而不是COUNT會更清楚一些,因爲對於開發人員COUNT排除NULL值可能並不明顯。