标题: 测试查询速度 [打印本页] 作者: t小宝 时间: 2008-1-14 20:58 标题: 测试查询速度 我们通常需要在一个有分类字段的表中,查询每个分类的最大数量或最小数量,有一个办法是在查询条件中使用域聚合函数,但大家都知道,域聚合函数效率很低,如果有其它可代替的办法就会首先使用其它办法,象这里就可以在条件中使用子查询。而子查询又有两种办法,一种是用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