设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2116|回复: 5
打印 上一主题 下一主题

[查询] 测试查询速度

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2008-1-14 20:58:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们通常需要在一个有分类字段的表中,查询每个分类的最大数量或最小数量,有一个办法是在查询条件中使用域聚合函数,但大家都知道,域聚合函数效率很低,如果有其它可代替的办法就会首先使用其它办法,象这里就可以在条件中使用子查询。而子查询又有两种办法,一种是用SQL 聚合函数max或min,另一种对记录排序然后用TOP 1取第一条。
    还是举个例子比较直观,表1中有分类和数量两个字段,有20个分类,共200条记录,要查询每个分类的最大数量,使用子查询有两个方法,SQL语句分别如下:
    SELECT 分类, 数量 FROM 表1 AS a WHERE 数量=(Select max(数量) From 表1 Where 分类=a.分类)
    SELECT 分类, 数量 FROM 表1 AS a WHERE 数量=(Select top 1 数量 From 表1 Where 分类=a.分类 Order by 数量 desc)
    第一句使用max函数,第二句对记录排序后用TOP取第一条。那么这两种方法哪一种更快一点呢(哈,我是个好奇心很重的人)?我进行了测试,分别用上面两个语句打开记录集10000次,看看哪个用时更多一点。

代码如下:
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 分类, 数量 FROM 表1 AS a WHERE 数量=(Select max(数量) From 表1 Where 分类=a.分类)"
    sttop = "SELECT 分类, 数量 FROM 表1 AS a WHERE 数量=(Select top 1 数量 From 表1 Where 分类=a.分类 Order by 数量 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

结果是:第一句max用时58秒,第二句top...desc用时67秒。
说明了max比top...desc快一点
10000次才快那么一点,收获不大。

再来,这次取每个分类的最小数量。
第一句用min代替max,第二句取消desc。
结果是:第一句min用时40秒,第二句top用时45秒。
哈,这次收获多一点了。
min比top快那么一点,
再对比前面,发现取最小值(min)比取最大值(max)快18秒,升序语句(top)比降序语句(top...desc)22秒。

好象收获还不是很大哦。再继续。。。
把那两个SQL语句生成固定查询,在测试代码中打开固定查询作为记录集。

得到取分类最大数量结果是:max用时30秒,top...desc用时35秒。
分别比用SQL语句打开记录集快了差不多一倍。
取分类最小数量,结果是:min用时13秒,top用时14秒。
竟然分别比用SQL语句快了两倍多。

准备结束了,在这里以提供测试结果为主,大家还可以进一步测试。

也简单总结一下我的测试结果:取最小最大值用SQL聚合函数max和min比用top加排序快;取最小值比取最大值快;使用固定查询比用SQL语句快
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2008-1-14 21:12:07 | 只看该作者
谢谢分享这么好的经验
3#
发表于 2008-1-14 21:55:08 | 只看该作者
虽然还没用到自己库中,但还是要顶一下。哈
4#
发表于 2008-1-14 23:16:04 | 只看该作者
支持一下
5#
发表于 2008-1-19 07:00:11 | 只看该作者
支持一下
6#
发表于 2008-1-19 07:54:08 | 只看该作者
t小宝可以做ACCESS课题的研究生了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-25 08:46 , Processed in 0.160827 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表