會員登錄 - 用戶注冊 - 網(wǎng)站地圖 Office中國(office-cn.net),專業(yè)Office論壇
當(dāng)前位置:主頁 > 技巧 > Access技巧 > 查詢視圖 > 正文

測試查詢速度

時(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)

頂一下
(0)
0%
踩一下
(0)
0%
發(fā)表評論
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
評價(jià):