我正在尝试过滤一个小的adodb记录集。这是我们测试客户的6条记录。 由于某种原因,过滤器需要2秒才能完成,我在asp页面上执行此操作大约30次。因此,使我的页面加载速度很慢。此页面上的其他记录集过滤器正在快速运行。
我尝试过设置不同的CursorLocations和CursorTypes ..
任何人都可以帮我确定为什么这个过滤器太慢了吗?
rsAvgPrice.Filter = "CommodityID = 13 AND CropYear = '12'"
答案 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。 从而加速过滤器的跨越式发展。