테이블 생성:
CREATE TABLE [TestTable] (
[ID] [int] IDENTITY (1, 1) NOT NULL,
[이름] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[성] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[국가] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[참고] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) [기본] 사용
GO
삽입 데이터: (20,000개 항목, 더 많은 데이터로 테스트하는 것이 더 명확해질 것입니다)
SET IDENTITY_INSERT TestTable ON
선언 @i int
@i=1로 설정
@i<=20000 동안
시작하다
TestTable([id], FirstName, LastName, Country,Note) 값(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')에 삽입
@i=@i+1로 설정
SET IDENTITY_INSERT TestTable
종료
OFF
-------------
페이징 솔루션 1: (Not In 및 SELECT TOP 사용) 페이징)
명세서 양식:
상위 10개* 선택
테스트테이블에서
어디에(신분증이 없습니다
(상위 20개 ID 선택
테스트테이블에서
ID로 주문))
ID로 주문
TOP 페이지 크기 선택*
테스트테이블에서
어디에(신분증이 없습니다
(SELECT TOP 페이지 크기 * 페이지 번호 ID
테이블에서
ID로 주문))
ORDER BY ID
--------------------------
페이징 구성표 2: (합계 사용 SELECT TOP 페이징보다 ID가 얼마나 큰지)
명세서 양식:
상위 10개* 선택
테스트테이블에서
어디서(ID >
(SELECT MAX(id)
FROM(상위 20개 ID 선택
테스트테이블에서
id) AS T))로 주문
ID로 주문
TOP 페이지 크기 선택*
테스트테이블에서
어디서(ID >
(SELECT MAX(id)
FROM (SELECT TOP 페이지 크기 * 페이지 번호 ID
테이블에서
id) AS T))로 주문
ID로 주문
-------------
페이징 구성표 3: (SQL 커서 저장 프로시저 페이징 사용) )
XiaoZhengGe 프로시저 생성
@sqlstr nvarchar(4000), --query 문자열
@currentpage int, --페이지 N
@pagesize int --페이지당 줄 수
~처럼
카운트 안함 설정
@P1 int를 선언합니다. --P1은 커서의 ID입니다.
@rowcount 정수
exec sp_cursoropen @P1 출력,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount 출력
총 페이지 수로 최대 한도( 1.0*@rowcount/@pagesize )를 선택합니다.-, 총 행 수로 @rowcount, 현재 페이지로 @currentpage를 선택합니다.
@currentpage=(@currentpage-1)*@pagesize+1 설정
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
다른 해결 방법: 기본 키가 없는 경우 임시 테이블을 사용하거나 해결 방법 3을 사용할 수 있지만 효율성이 떨어집니다.
최적화 시 기본 키와 인덱스를 추가하면 쿼리 효율성이 향상되는 것이 좋습니다.
SQL 쿼리 분석기를 통해 비교 표시: 내 결론은 다음과 같습니다.
페이징 방식 2: (무엇보다 큰 ID 사용 및 페이징을 위해 SELECT TOP 사용) 가장 효율적이며 SQL 문을 연결해야 합니다. 페이징 방식 1: (페이징을 위해 Not In 및 SELECT TOP 사용) 두 번째로 효율적인, SQL 문을 연결해야 합니다. 페이징 방식 3: (SQL의 페이징 방식 사용) 커서 저장 프로시저 페이징)은 효율성이 가장 낮지만,
실제 상황에서는 구체적인 분석이 필요합니다.