0

我有一个要过滤的小型 adodb 记录集。这是我们测试客户的 6 条记录。由于某种原因,过滤器需要 2 秒才能完成,而我在我的 asp 页面上这样做了大约 30 次。因此,使我的页面加载速度非常慢。此页面上的其他记录集筛选器运行得很快。

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

谁能帮我确定为什么这个过滤器这么慢?

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

2 回答 2

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

这是大体思路,希望您可以根据实际需要使用它。

于 2012-12-05T07:37:09.313 回答
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 填充了一个临时记录集。然后,我用临时记录集逐条记录手动填充我声明的记录集。这允许我将光标位置设置为 adUseClient。从而突飞猛进地加速过滤器。

于 2012-12-05T17:32:08.363 回答