효율적인 선택 상단 페이징 알고리즘. 코드는 다음과 같습니다.
<%
'페이지 당 레코드 수
Dim Pagesize
pagesize = 30
'총 레코드 수, 총 페이지 수, Piaoyi Notes 읽기
DIM TotalRecords, TotalPages
sqlstr = 표 1의 레코드로서 count (id)를 선택하십시오
set rs = conn.execute (sqlstr, 0,1)
Totalrecords = rs (레코드)
int (totalrecords/pagesize) = TotalRecords/Pagesize 인 경우
TotalPages = TotalRecords/Pagesize
또 다른
TotalPages = int (TotalRecords/Pagesize) +1
끝 If
Rs.Close
RS = 아무것도 설정하지 않습니다
'현재 페이지 번호, Piaoyi Note
희미한 페이지
페이지 = 요청 (페이지)
iSnumeric (page) = false 인 경우
response.write <script language = javaScript> alert ( '매개 변수 오류!');
response.write window.close (); </script>
응답. 엔드
끝 If
page = 또는 page <1 인 경우 page = 1
page-totalpages> 0 인 경우 page = totalpages
page = int (페이지)
Page = 1 인 경우
SQL = TOP & Pagesize, 제목, Time Wy Time Desc의 시간 선택 및 Pagesize, 제목, 시간
또 다른
sql = top & pagesize, 제목, time <(time <(time)에서 min (time)을 선택하십시오 (top & pagesize*(page-1)) & time desc에서 time desc에서 t time as t) 주문 desc를 선택하십시오.
끝 If
set rs = server.createobject (adodb.recordset)
Rs. Open SQL, Conn, 1,1
rs.eof가 아니라
응답. 각 레코드 정보를 작성하십시오 : & rs (id) & <br>
rs.movenext
고리
Rs.Close
RS = 아무것도 설정하지 않습니다
``페이지 턴 코드가 생략되었습니다 ...
%>
이것은 매우 효율적인 페이징 알고리즘입니다. 데이터 테이블의 데이터 양이 수백만에 도달하면 위의 페이징 알고리즘의 응답 시간은 일반적으로 수십 밀리 초 이내에 매우 짧습니다. 원칙은 매우 간단합니다.
위의 두 페이징 알고리즘의 예에서 Flymorn은 시간 필드 시간을 정렬하여 사용합니다. 대부분의 시스템에서는 최근에 사용자를 업데이트해야합니다 (새로 추가 된 레코드 및 새로운 수정 포함) 기존 레코드 (오래된 레코드)의 내용은 자동으로 번호가 매겨진 ID 만 정렬 필드로 사용되면 사용자가 편집 한 이전 정보가 전면에 표시되지 않습니다. 이것이 Flymorn이 시간 필드를 사용하는 이유입니다.
여기에는 집계 된 인덱싱 문제가 포함됩니다. 기본적으로 자동 번호가 매겨진 ID를 기본 키로 사용하고 위의 ID 열을 사용하여 위의 알고리즘을 정렬하면 데이터베이스가 더 적게 응답합니다. 최근에 업데이트 된 컨텐츠를 이전 컨텐츠에 표시해야한다는 질문을 언급 했으므로 시간 필드를 사용하여 정렬해야합니다. 따라서 더 높은 페이징 효율을 달성하기 위해 데이터베이스를 설계 할 때이 시간 필드를 집계 색인 열로 설계 할 수 있습니다.
이러한 설계 후에는 전반적인 페이징 효율이 크게 향상됩니다.
그러나이 시간 필드를 집계 색인 열로 사용하는 데있어 또 다른 사소한 문제가 있습니다. 데이터 테이블이 배열되면 사용자가 데이터를 추가 할 때는 물리적으로 정렬되므로 데이터 테이블의 끝에 추가하십시오 데이터베이스는이 집계 인덱스 열을 기반으로해야합니다. 또한 새로 편집 된 정보를 테이블 끝에 언급하여 일정 시간이 걸립니다. 즉, 시간 필드를 집계 색인 열로 사용하면 데이터 업데이트를 할 때 시간을 조금 더 소비해야합니다.
그러나 포괄적 인 비교에서 Piaoyi는 Select Top의 효율적인 페이징 알고리즘의 핵심은 전체 테이블 스캔을 피하고 정렬 된 필드만으로 집계 된 인덱스 열을 얻는 것입니다 정렬 된 SQL 문의 응답 시간이 가장 빠릅니다. 이 처리 후 SQL Server 데이터베이스의 경우 수백만 개의 데이터가 있더라도 페이징 알고리즘이 응답을 잃을 것이라고 걱정할 필요가 없습니다.
위는 예를 들어 ASP 언어로 작성된 알고리즘이며 물론 ASP.NET 및 PHP와 같은 다른 언어로도 수정할 수도 있습니다. 이러한 페이징 코드를 더 잘 사용하려면 위의 알고리즘을 저장 프로 시저로 다시 작성할 수도 있습니다.
마지막으로 작은 질문을 남기십시오. 상단 페이징을 선택할 때 페이지가 끝으로 바뀌면 정렬 필드 열이 집계 인덱스 열이 아닌 경우 어떻게됩니까?