KB-T-SQL找最大值方法的效能比較

今天跟同事討論用T-SQL查資料表中最大值的方法,一群人總共想出三種: SELECT TOP 1 + ORDER BY, SELECT MAX, 再來是用CURSOR的FETCH LAST。三種做法,哪一個最有效率呢? 初步想起來,用CURSOR是最笨重的,肯定最慢。剩下的兩種,MAX()是Aggregate Function,依據我過去寫SQLCLR自訂Aggregate Function的經驗,每一列的資料都要送入Funtion中比較,應該會輸給內建的ORDER BY吧?

找來一個有150萬筆資料的Table,做了以下的實驗:

--方法1 用ORDER BY+TOP
select top 1 dst from netlog order by dst desc

--方法2 用MAX

select max(dst) from netlog

--方法3 用CURSOR

declare @dst varchar(15)

declare cur scroll cursor for select dst from netlog order by dst

open cur

fetch last from cur into @dst

select @dst

close cur

deallocate cur

實驗結果證明我之前的推論是錯的,MAX以750ms奪冠,TOP 1 + ORDER BY以921ms居次,CURSOR則以7203ms被甩到連車尾燈都看不到。仔細分析,ORDER BY必須一筆筆理出所有ROW的順序,對MIN或MAX來說純粹是做虛工,浪費資源卻沒有任何貢獻,是該敗陣。(這裡有一篇相關文章)

結論是,如果你只是要查最大或最小值時,MAX()與MIN()會比TOP 1 + ORDER BY更有效率!

另外,SQL 2005的SQL Server Management Studio(SSMS)的Cient Statistics功能比起SQL 2000 Query Analyzer豪華許多,會自動幫你進行多次執行結果的比較,還會用紅、綠、黑箭頭代表上漲、下跌跟平盤(我好像開始有職業病傾向了)。找不到啟動選單的人可以看以下的圖例:

歡迎推文分享:
Published 29 March 2007 06:04 PM 由 Jeffrey
Filed under: , ,
Views: 17,451



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<March 2007>
SunMonTueWedThuFriSat
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication