在小adodb记录集上过滤2秒钟

时间:2012-12-04 20:16:17

标签: asp-classic vbscript adodb

我正在尝试过滤一个小的adodb记录集。这是我们测试客户的6条记录。 由于某种原因,过滤器需要2秒才能完成,我在asp页面上执行此操作大约30次。因此,使我的页面加载速度很慢。此页面上的其他记录集过滤器正在快速运行。

我尝试过设置不同的CursorLocations和CursorTypes ..

任何人都可以帮我确定为什么这个过滤器太慢了吗?

rsAvgPrice.Filter = "CommodityID = 13 AND CropYear = '12'"

2 个答案:

答案 0 :(得分:0)

可能会再次执行整个查询,然后才会应用过滤器。

我会对所有项目进行一次循环,将所需数据存储在局部变量中,然后拥有自己的过滤器。效率最高,控制力更好。

例如,如果您希望通过这两个字段过滤数据,我会像这样使用Dictionary:

Dim oCommodity_CropYear_Data, curKey
Dim curCommodityID, curCropYear, curData
Set oCommodity_CropYear_Data = Server.CreateObject("Scripting.Dictionary")
Do Until rsAvgPrice.EOF
    curCommodityID = rsAvgPrice("CommodityID")
    curCropYear = rsAvgPrice("CropYear")
    curKey = curCommodityID & "_" & curCropYear
    curData = "field1: " &  rsAvgPrice("somefield") & ", field 2: " & rsAvgPrice("other_field") & "<br />"
    oCommodity_CropYear_Data(curKey) = oCommodity_CropYear_Data(curKey) & curData
    rsAvgPrice.MoveNext
Loop
rsAvgPrice.Close

然后在循环中提取数据:

For x=1 To 30
    For y=1 To 12
        curKey = x & "_" y
        If oCommodity_CropYear_Data.Exists(curKey) Then
            Response.Write("Data for Commodity " & x & " and CropYear " & y & ":<br />" & oCommodity_CropYear_Data(curKey)
        End If
    Next
Next

这是一般性的想法,希望您可以根据实际需要使用它。

答案 1 :(得分:0)

我已经解决了这个问题。

问题是当我按以下方式声明记录集时,光标类型设置为adOpenForwardOnly,光标位置设置为adUseServer。如果使用command.Execute填充记录集,则无法更改这些设置。

Set cmd = Server.CreateObject("ADODB.Command")

cmd.CommandType = adCmdText

cmd.CommandText = mySQL

cmd.CommandTimeout = 3000

cmd.ActiveConnection = cn

Set rs = Server.CreateObject("ADODB.Recordset")

Set rs = cmd.Execute

Set cmd = Nothing

我解决这个问题的方法是手动声明一个带有字段的永久记录集。然后我使用command.execute填充了一个临时记录集。然后我按记录手动填充我的声明记录集和临时记录集记录。这允许我将cursorlocation设置为adUseClient。 从而加速过滤器的跨越式发展。