2014-01-23 4 views
0

고전적인 ASP 응용 프로그램을 사용하는 클라이언트의 프로젝트를 진행하고 있습니다. 자신의 환경이 이전보다 훨씬 느리게 수행되고 있습니다. 다양한 다른 환경. 나는 많은 해결책을 가지고있다. 그러나 부진은 이전에 보지 못했던 것을 보게했습니다. 이것은 "아카드적인"질문 일뿐입니다. 내가 가진 카테고리 페이지를 이해하는 것이 궁금ADODB.Recordset의 .CacheSize/.PageSize를 사용하여로드 시간이 분산 됨

1800 개 제품 레코드를 모두 페이지 당 50 개의 제품을 표시하도록 설정하는 경우 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까지 실행되지만 초기 레코드 set/getRows() 배열이 클수록 시간이 오래 걸립니다. 즉, 루프를 종료하기 전에 초기 레코드 set/getRows() 배열이 여전히 동일한 레코드 수/행을 반복 할 때 더 큰 경우 처음 50 개 레코드를 반복하는 데 시간이 오래 걸리는 이유는 무엇입니까?

MS SQL 서버 2008 R2 웹 에디션

답변

0

당신은 실제로 레코드의 수를 반환 제한되지 않습니다 실행합니다. 그것은 36 배 이상의 레코드를로드하는 데 시간이 더 걸릴 것입니다. ROW_NUMBER() OVER (SELECT * ( 로부터

SELECT * : 당신은 그들 모두를 검색하고이 시도 처음 50

후 루프를 종료하는 것보다 직접 오히려 레코드를 제한하는 쿼리를 변경해야 INNER가 tableA.key = tableB.key ON TableB의 가입 TABLEA FROM ROWNUM AS tableA.Key BY ORDER) WHERE ROWNUM은 또한

1 ~ 50 것은 열이 있는지 확인 ResultSet의 AS {다른 정제 기준}) 가입하는 데 사용중인 색인 생성.