이 글의 목적은 빅데이터의 페이지 브라우징을 실현하고 속도를 최적화하는 것입니다.
웹 응용 프로그램을 구축하려면 페이징 브라우징 기능이 필수적입니다. 이 문제는 오랫동안 가장 일반적인 문제였으며 그중에서도 ASP 프로그램을 사용하는 등 많은 페이징 알고리즘이 있습니다. ado 개체의 PageSize 속성 총 레코드 수를 기준으로 페이지를 계산한 다음 레코드 세트로 이동한 다음 저장 프로시저를 작성하여 페이징 데이터를 구현하는 방법도 있습니다. 아래에서는 실제 프로젝트에서 매우 빠른 페이징 알고리즘을 소개하겠습니다.
요점: SQL( TOP 및 자동 번호 매기기를 사용하여 구현)
페이지 스크립트(브라우저 대체 기능)
환경:
IIS/SQL 서버/액세스
테이블 구조:
테이블 내용 테이블 생성(
자동 번호 IDENTITY(int, 1,1)는 null이 아닙니다.
분류 코드<I>var</I>char(20) null,
제목<I>var</I>char(255) NULL,
콘텐츠<I>var</I>char(4000) null,
시간 날짜/시간 null,
)
구현 원칙:
이 테이블은 자동 번호 매기기 필드로 설정됩니다. 이 필드의 특징은 레코드를 삭제한 후에도 필드가 여전히 '유동적'으로 유지된다는 점을 포함하여 중복되지 않는 형태를 생성하는 것입니다(참고: 일반적으로 시스템 테이블 구성에서 이 필드는 필드는 숫자를 자유롭게 관리할 수 없기 때문에 거의 사용되지 않지만, 여기서는 주로 기사에서 숫자 유지를 위한 코드를 생략하기 위해 사용합니다.
쪽수 매기기:
그런 다음 첫 번째 단계는 페이지의 데이터를 쿼리하는 것입니다. 한 페이지에 100개의 레코드가 있고 20개의 레코드가 사용되는 경우 일반적인 페이징 알고리즘은 "총 페이지 수 = 총 레코드를 페이징 제어 수로 나눈 값입니다. 나머지는 총 페이지 수에 1을 더한 것입니다. ]", 이 접근 방식을 사용하면 모든 레코드로 구성된 대규모 레코드 세트를 생성해야 합니다. 따라서 일부 사람들은 저장 프로시저의 페이징 알고리즘을 사용하도록 제안했습니다. 전자는 ASP입니다. 꽤 느리고 후자가 닭을 죽이는 스크립트입니다. 비록 저장 프로시저를 자주 작성하지만 내 생각에 따르면 저장 프로시저를 작성하는 것은 완전히 중복되는 일입니다.
SQL을 처음 접하는 많은 친구들은 Top 수정 키워드의 역할을 알고 있습니다. 예를 들면 다음과 같습니다. select TOP 1 * from table1 -- 이 방법으로 Table1 테이블에서 단 하나의 레코드가 있는 레코드 세트가 반환됩니다. 페이징 최적화의 목표는 TOP를 통해 지나치게 큰 레코드 집합을 생성하는 것을 방지하는 것입니다. 이제 쿼리 테이블은 콘텐츠 테이블에서 자동 번호 매기기, 제목, 콘텐츠 및 시간 상위 20개를 선택해야 합니다.
하지만 여전히 문제가 있습니다. 즉, Top이 특정 페이지를 자동으로 배치하고 출력하는 것은 불가능합니다. 참고: 레코드 정렬 순서는 매우 중요합니다. 이는 이 알고리즘의 성공 또는 실패를 결정합니다.
여기에서 설명하는 DESC 방법은 역순으로 정렬됩니다. 예를 들어 웹 사이트의 소프트웨어 업데이트의 경우 최신 업데이트가 먼저 배치되며 이것이 역순 방법입니다.
자, 실제 코드를 살펴보겠습니다. 먼저 시작 페이지인지 확인해야 합니다.
희미한 strSQL,i,endID,isBeginPage
const Cnt_PageSize = 20 '각 레코드 페이지의 크기를 정의합니다.
'브라우저가 전달한 Page 파라미터의 값을 확인하여 다음 페이지로 진입하는 동작인지 판단
isBeginPage = isEmpty(request("페이지")) 또는 request("페이지")="" 또는 request("페이지")<>"next"
'여기가 페이징의 핵심이다
if isBeginPage then '시작 페이지인 경우
'Query = 분류 코드가 flbm 매개변수와 동일한 레코드를 역순으로 나열하고 첫 번째 Cnt_PageSize 펜만 나열합니다(Cnt_PageSize는 20과 같은 상수 정의입니다).
strSQL = "select TOP " & Cnt_pageSize & " 자동 번호 매기기, 제목, 내용, 분류 인코딩이 '" & TRIM(SQLEncode(request("flbm"))) & "' 자동 번호 매기기 설명에 따른 콘텐츠 테이블의 시간"
else '시작 페이지가 아니면
if request("Page")="next" then '코드의 성능을 향상시키기 위해 여기에 작성한 것입니다. 매개변수가 next이면 페이지의 내용을 가져오라는 뜻입니다.
'질의 = 분류 코드가 flbm 매개변수와 동일하고 자동 번호 endID보다 작아야 하는 레코드를 나열하고(endID도 매개변수임) 역순으로 정렬하여 첫 번째 Cnt_PageSize 펜만 나열합니다(Cnt_PageSize는 상수 정의(예: 20)
strSQL = "select TOP " & Cnt_pageSize & " 자동 번호 매기기, 제목, 내용, 분류 인코딩 = '" & TRIM(SQLEncode(request("flbm"))) & "' 및 자동 번호 매기기<" & 요청인 콘텐츠 테이블의 시간 ("endID") & "자동 번호 설명으로 주문"
다음과 같은 경우 종료
end if
'데이터 연결을 열어 SQL을 실행하고 레코드 세트를 생성합니다.
rs = Cnn.Execute(strSQL) 설정
rs.Eof가 아닌 경우 'Eof인지 확인하려면 여기에 작성하십시오. 꼭 필요한 것은 아니지만 여기서는 특별한 의미가 있습니다.
call TableTitle '여기에 테이블 태그를 생성하는 데 사용되는 자체 작성 함수가 있습니다.
call startTr '여기에 i=0에서 rs.fields.Count-1에 대한 테이블을 생성하기 위한 tr 표시가 있습니다.
'레코드 세트 필드를 탐색합니다.
call AddCol(rs(i).name) '출력 필드 이름
다음
endTr을 호출합니다
. '레코드 세트의 내용을 반복하고 출력합니다.
i=0에서 rs.fields.Count-1에 대해
startTr을 호출합니다.
AddRow(ASPEncode(rs(i).value))를 호출합니다.
다음
통화 종료 Tr
endID = rs("automatic numbering") '각 출력의 자동 번호 매기기 값을 여기에 저장합니다.
rs.이동다음
향하게 하다
TableBottom '지금까지는 단순히 레코드 세트의 모든 내용을 출력했습니다.
'페이지 넘김 표시가 여기에 출력됩니다. vbaIIF는 자체 작성 함수입니다.
프로토타입은 <I>함수</I> vbaIIF(a,b,c)입니다.
그렇다면
vbaIIF=b
또 다른
vbaIIF =c
종료하면
<I>기능</I> 종료
이전 페이지의 구현은 스크립트를 통해 브라우저 함수인 History.back(1)을 호출함으로써 이루어집니다. 그러면 페이지로 돌아올 때 서버 측에서 데이터를 다시 생성할 필요가 없으며 속도도 고려할 필요가 없습니다. .
홈 페이지에서는 이전 페이지에 대한 링크가 유효하지 않아야 합니다. 이는 vbaIIF(isBeginPage, "disabled", "")를 통해 수행됩니다. 홈 페이지인 경우 비활성화된 속성을 태그에 추가합니다. 홈 페이지가 아닌, 탐색 페이지를 롤백하는 데 사용되는 스크립트 명령인 History.back(1)을 추가합니다.
다음 페이지는 Page 매개변수와 endID 매개변수를 전달하는 것입니다. Page는 다음 페이지의 작업을 나타내기 위해 next로 설정됩니다. endID는 현재 레코드 세트의 끝 번호를 나타내고 다음 페이지는 여기에서 페이지가 매겨집니다.
response.Write("〈a href=""#"" onclick=""java<I>스크립트</I>:" & vbaIIF(isBeginPage,"","history.back(1);") & "" " " & vbaIIF(isBeginPage," 비활성화됨 ","") & "〉이전 페이지〈/a〉|〈a href=""TypeOptions.asp?fllbm=" & request("flbm") & "&Page=next&endID = " & endID & """〉다음 페이지〈/a〉")
또 다른
'여기서 레코드 세트가 비어 있는지 판단함으로써 마지막 페이지까지 계속해서 페이지를 넘기는 문제를 해결할 수 있습니다.
isBeginPage가 아니면
'빈 레코드인지, 시작 페이지가 아닌지 확인한 다음 롤백 페이지에 대한 스크립트를 생성하면 페이지에 들어간 후 자동으로 이전 페이지로 돌아갑니다.
response.Write "〈<I>스크립트</I> 언어=java<I>스크립트</I>〉" & vbCrlf
Response.Write "history.back(1);" & vbCrlf
응답."〈/<I>스크립트</I>>" 쓰기
응답.종료
else '시작 페이지 기록인 경우 비어 있으며 내용이 없다는 메시지가 표시됩니다.
응답.쓰기 "〈글꼴 색상=파란색〉이 카테고리에는 콘텐츠가 없습니다〈/글꼴〉"
종료하면
endIf
요약: 프런트 엔드 스크립트와 SQL 쿼리 기술을 통해 고성능 페이징 프로그램은 간단하고 빠릅니다.
동료들이 더 나은 실시간 데이터 페이징 알고리즘을 생각해 낼 수 있기를 바랍니다.
참고: 포럼에서는 HTML 문자를 제한하므로 주요 기호는 다음과 같습니다. 한자 대문자.