Arrays ADODB.Recordset中.CacheSize/.PageSize的加载时间差异
我正在为一个客户开发一个项目,使用一个我非常熟悉的经典ASP应用程序,但是在他的环境中,它的运行速度比我在其他各种环境中看到的都慢。我有很多解决方案;然而,这种迟钝让我不得不去看一些我以前从未看过的东西——这更像是一个愚蠢的问题 我很想知道,当两个页面都设置为每页显示50个产品时,加载1800个产品记录的分类页面所需的时间是加载54个产品记录的分类页面所需时间的3倍。也就是说,当要循环的项目数相同时,为什么总记录数的差异会在加载显示的产品数时产生差异,而这是一个常量 以下是使用的方法,抽象到基本方面:Arrays ADODB.Recordset中.CacheSize/.PageSize的加载时间差异,arrays,performance,asp-classic,recordset,page-load-time,Arrays,Performance,Asp Classic,Recordset,Page Load Time,我正在为一个客户开发一个项目,使用一个我非常熟悉的经典ASP应用程序,但是在他的环境中,它的运行速度比我在其他各种环境中看到的都慢。我有很多解决方案;然而,这种迟钝让我不得不去看一些我以前从未看过的东西——这更像是一个愚蠢的问题 我很想知道,当两个页面都设置为每页显示50个产品时,加载1800个产品记录的分类页面所需的时间是加载54个产品记录的分类页面所需时间的3倍。也就是说,当要循环的项目数相同时,为什么总记录数的差异会在加载显示的产品数时产生差异,而这是一个常量 以下是使用的方法,抽象到基本
SELECT {tableA.fields} FROM tableA, tableB WHERE tableA.key = tableB.key AND {other refining criteria};
set rs=Server.CreateObject("ADODB.Recordset")
rs.CacheSize=iPageSize
rs.PageSize=iPageSize
pcv_strPageSize=iPageSize
rs.Open query, connObj, adOpenStatic, adLockReadOnly, adCmdText
dim iPageCount, pcv_intProductCount
iPageCount=rs.PageCount
If Cint(iPageCurrent) > Cint(iPageCount) Then iPageCurrent=Cint(iPageCount)
If Cint(iPageCurrent) < 1 Then iPageCurrent=1
if NOT rs.eof then
rs.AbsolutePage=Cint(iPageCurrent)
pcArray_Products = rs.getRows()
pcv_intProductCount = UBound(pcArray_Products,2)+1
end if
set rs = nothing
tCnt=Cint(0)
do while (tCnt < pcv_intProductCount) and (count < pcv_strPageSize)
{display stuff}
count=count + 1
loop
通过getRows将记录集转换为数组并销毁;显示的记录将始终为iPageSize或更小
这是一个大问题:
为什么,在较大记录集~1800条记录的初始页面加载中,循环页面大小(例如50条记录)所需的时间比较小记录集~54条记录所需的时间要长得多?无论采用哪种方式,它都会从0运行到49,但初始记录集/getRows数组越大,执行此操作所需的时间就越长。也就是说,当初始记录集/getRows数组更大时,为什么在退出循环之前仍循环通过相同数量的记录/行时,循环通过前50条记录所需的时间更长
运行MS SQL Server 2008 R2 Web edition时,实际上并没有限制返回的记录数。加载36倍以上的记录需要更长的时间。您应该更改查询以直接限制记录,而不是检索所有记录并在前50个记录之后终止循环 试试这个: 选择* 从…起 选择*,按表格A排序的行号。键为RowNum 从表格 内连接表B 关于table a.key=table b.key 其中{其他优化条件}作为结果集 其中RowNum介于1和50之间 还要确保用于连接的列已编制索引