測試查詢速度
時(shí)間:2009-11-11 08:29 來源:網(wǎng)絡(luò) 作者:t小雨 閱讀:次
|
我們通常需要在一個(gè)有分類字段的表中,查詢每個(gè)分類的最大數(shù)量或最小數(shù)量,有一個(gè)辦法是在查詢條件中使用域聚合函數(shù),但大家都知道,域聚合函數(shù)效率很低,如果有其它可代替的辦法就會首先使用其它辦法,象這里就可以在條件中使用子查詢。而子查詢又有兩種辦法,一種是用SQL 聚合函數(shù)max或min,另一種對記錄排序然后用TOP 1取第一條。 還是舉個(gè)例子比較直觀,表1中有分類和數(shù)量兩個(gè)字段,有20個(gè)分類,共200條記錄,要查詢每個(gè)分類的最大數(shù)量,使用子查詢有兩個(gè)方法,SQL語句分別如下: SELECT 分類, 數(shù)量 FROM 表1 AS a WHERE 數(shù)量=(Select max(數(shù)量) From 表1 Where 分類=a.分類) SELECT 分類, 數(shù)量 FROM 表1 AS a WHERE 數(shù)量=(Select top 1 數(shù)量 From 表1 Where 分類=a.分類 Order by 數(shù)量 desc) 第一句使用max函數(shù),第二句對記錄排序后用TOP取第一條。那么這兩種方法哪一種更快一點(diǎn)呢(哈,我是個(gè)好奇心很重的人)?我進(jìn)行了測試,分別用上面兩個(gè)語句打開記錄集10000次,看看哪個(gè)用時(shí)更多一點(diǎn)。
代碼如下: Public Sub max_pk_top() Dim dbs As DAO.Database Dim rsmax As DAO.Recordset Dim rstop As DAO.Recordset Dim stmax As String Dim sttop As String Dim dmx As Date Dim dtp As Date Dim i As Integer Set dbs = CurrentDb stmax = "SELECT 分類, 數(shù)量 FROM 表1 AS a WHERE 數(shù)量=(Select max(數(shù)量) From 表1 Where 分類=a.分類)" sttop = "SELECT 分類, 數(shù)量 FROM 表1 AS a WHERE 數(shù)量=(Select top 1 數(shù)量 From 表1 Where 分類=a.分類 Order by 數(shù)量 desc)" dtp = Now() For i = 0 To 10000 Set rstop = dbs.OpenRecordset(sttop) rstop.Close Next dtp = Now() - dtp dmx = Now() For i = 0 To 10000 Set rsmax = dbs.OpenRecordset(stmax) rsmax.Close Next dmx = Now() - dmx Debug.Print "max: " & dmx Debug.Print "mtp: " & dtp Set rsmax = Nothing Set rstop = Nothing Set dbs = Nothing End Sub
結(jié)果是:第一句max用時(shí)58秒,第二句top...desc用時(shí)67秒。 說明了max比top...desc快一點(diǎn)。 10000次才快那么一點(diǎn),收獲不大。
再來,這次取每個(gè)分類的最小數(shù)量。 第一句用min代替max,第二句取消desc。 結(jié)果是:第一句min用時(shí)40秒,第二句top用時(shí)45秒。 哈,這次收獲多一點(diǎn)了。 min比top快那么一點(diǎn), 再對比前面,發(fā)現(xiàn)取最小值(min)比取最大值(max)快18秒,升序語句(top)比降序語句(top...desc)快22秒。
好象收獲還不是很大哦。再繼續(xù)。。。 把那兩個(gè)SQL語句生成固定查詢,在測試代碼中打開固定查詢作為記錄集。
得到取分類最大數(shù)量結(jié)果是:max用時(shí)30秒,top...desc用時(shí)35秒。 分別比用SQL語句打開記錄集快了差不多一倍。 取分類最小數(shù)量,結(jié)果是:min用時(shí)13秒,top用時(shí)14秒。 竟然分別比用SQL語句快了兩倍多。
準(zhǔn)備結(jié)束了,在這里以提供測試結(jié)果為主,大家還可以進(jìn)一步測試。
也簡單總結(jié)一下我的測試結(jié)果:取最小最大值用SQL聚合函數(shù)max和min比用top加排序快;取最小值比取最大值快;使用固定查詢比用SQL語句快。
| |
(責(zé)任編輯:admin)