我有一个要过滤的小型 adodb 记录集。这是我们测试客户的 6 条记录。由于某种原因,过滤器需要 2 秒才能完成,而我在我的 asp 页面上这样做了大约 30 次。因此,使我的页面加载速度非常慢。此页面上的其他记录集筛选器运行得很快。
我尝试设置不同的 CursorLocations 和 CursorTypes ..
谁能帮我确定为什么这个过滤器这么慢?
rsAvgPrice.Filter = "CommodityID = 13 AND CropYear = '12'"
我有一个要过滤的小型 adodb 记录集。这是我们测试客户的 6 条记录。由于某种原因,过滤器需要 2 秒才能完成,而我在我的 asp 页面上这样做了大约 30 次。因此,使我的页面加载速度非常慢。此页面上的其他记录集筛选器运行得很快。
我尝试设置不同的 CursorLocations 和 CursorTypes ..
谁能帮我确定为什么这个过滤器这么慢?
rsAvgPrice.Filter = "CommodityID = 13 AND CropYear = '12'"
可能会再次执行整个查询,然后才应用过滤器。
我将对所有项目进行一个循环,将所需数据存储在局部变量中,然后拥有自己的过滤器。最好的效率,更好的控制。
例如,如果您希望通过这两个字段过滤数据,我会像这样使用 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
这是大体思路,希望您可以根据实际需要使用它。
我已经解决了这个问题。
问题是当我通过以下方式声明记录集时,游标类型设置为 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。从而突飞猛进地加速过滤器。