문제

SQLServer 2000에서 페이징 쿼리를하는 가장 효율적인 방법은 무엇입니까?

"페이징 쿼리"는 MySQL에서 한계 문을 사용하는 것과 동일합니다.

편집 : 저장된 절차 가이 경우 세트 기반 쿼리보다 더 효율적일 수 있습니까?

도움이 되었습니까?

해결책

큰 결과 세트의 페이징 그리고 우승자는 RowCount를 사용하고 있습니다. 또한 더 복잡한 쿼리를위한 일반화 된 버전이 있습니다. 그러나 신용을 제공하십시오 Jasmin Muharemovic :)

DECLARE @Sort /* the type of the sorting column */
SET ROWCOUNT @StartRow
SELECT @Sort = SortColumn FROM Table ORDER BY SortColumn
SET ROWCOUNT @PageSize
SELECT ... FROM Table WHERE SortColumn >= @Sort ORDER BY SortColumn

이 기사에는 전체 소스 코드가 포함되어 있습니다.

"업데이트 2004-05-05"정보를 읽으십시오. !

다른 팁

나는 중첩 된 것 같아요 SELECT TOP n 쿼리는 아마도 그것을 달성하는 가장 효율적인 방법 일 것입니다.

SELECT TOP ThisPageRecordCount *
FROM Table
WHERE ID NOT IN (SELECT TOP BeforeThisPageRecordCount ID FROM Table ORDER BY OrderingColumn)
ORDER BY OrderingColumn

바꾸다 ThisPageRecordCount 페이지 당 항목과 함께 BeforeThisPageRecordCount ~와 함께 (PageNumber - 1) * items-per-page.

물론 SQL Server 2005의 더 좋은 방법은 ROW_NUMBER() CTE에서 기능.

쿼리의 효율성은 실제로 기본 테이블이 어떻게 구성되는지에 달려 있습니다. ID라는 기본 키가있는 경우 ID 인 경우 그리고 클러스터 된 인덱스입니다. 그리고 아무도 Identity_inserts를 수행하지 않았다고 가정 할 수 있으며 다음과 같은 쿼리를 수행 할 수 있습니다.

id> @lastpagesId 테이블에서 상단 XXX를 선택하십시오.

그러면 가능한 빨리 결과를 얻을 수 있습니다. 실제로 효율적으로 다른 모든 것은 이것에 대한 변형입니다. 아마도 ID가 아닐 수도 있습니다. 아마도 당신이 페이지에 사용하는 것은 실제로 당신이 독특하다고 생각하는 날짜 일 것입니다. 그러나 당신은 요점을 얻습니다 ... 여기에 표시된 () 기반 쿼리에서는 아마도 작동하지만 부분 클러스터 또는 커버링 인덱스 스캔의 성능을 터치하지는 않습니다.

나는 당신이 여기에있는 것이 SQL 2005로 업그레이드 해야하는 강력한 이유라고 생각합니다.

SQL 2005에서는 다음과 같이 빠르고 쉽게 수행 할 수 있습니다.

select ROW_NUMBER() over (order by [MyField]) as rowNum, *
from [MyTable]
where rowNum between @firstRow and @lastRow

당신이 정말로 SQL 2000에 갇혀 있다면 걱정합니다. Microsoft는 이제 2 세대가되었다는 점을 감안할 때 훨씬 더 오래 지원하지 않을 것입니다.

이 작업을 수행하는 가장 좋은 방법은 하나도 없을 것입니다. 모든 솔루션은 다소 해킹입니다.

그러나 @Petar Petrov의 답변은 아마도 가장 일관된 것일 것입니다.

  • 정렬의 작은 테이블에서 클러스터 된 인덱스를 다루는 경우 ASC-DESC 메소드 (상단을 사용하여 각각 두 가지 정렬을 동적으로 구축)가 더 빠를 수 있습니다.
  • 데이터가 비교적 정적이고 정렬이 고정 된 경우 정렬 순서를 변경할 때 업데이트하는 고유 한 rownum 필드를 추가 할 수 있습니다 (끔찍하지만 큰 테이블의 경우 빠릅니다).

나는 당신이 매번 쿼리 분석기로 몇 시간 동안 조정하고 있다고 생각합니다. 저장된 Proc은 어느 쪽이든 큰 차이를 만들지 않습니다. 쿼리 계획의 캐싱은 병목 현상이 될 가능성이 없습니다.

이것은 모든 테이블에서 Pagination을 수행 할 일반 SQL Server 2000 저장 프로 시저입니다. 저장된 절차는 테이블의 이름, 출력 열 (테이블의 모든 열에 대한 기본값), 조건, 선택적 정렬 순서, 검색 할 페이지 번호 및 페이지 당 행 수를 허용합니다.

    CREATE PROCEDURE [dbo].[GetPage]
    @pTableName VARCHAR(30),
    @pColumns VARCHAR(200) = '*',
    @pFilter VARCHAR(200) = '',
    @pSort VARCHAR(200) = '',
    @pPage INT = 1,
    @pPageRows INT = 10
    AS

    SET NOCOUNT ON
    DECLARE @vSQL VARCHAR(4000)
    DECLARE @vTempTable VARCHAR(30)
    DECLARE @vRowStart INT
    DECLARE @vTotalRows INT

    SET @vTempTable = '##Tmp' + CAST(DATEPART(YYYY, GETDATE()) AS VARCHAR(4)) +
    CAST(DATEPART(MM, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(DD, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(HH, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(MI, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(SS, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(MS, GETDATE()) AS VARCHAR(3))

    SET @vSQL = 'SELECT ' + @pColumns + ', IDENTITY(INT, 1, 1) AS ROWID INTO ' + @vTempTable + ' FROM ' + @pTableName

    IF @pFilter != '' AND @pFilter IS NOT NULL
    SET @vSQL = @vSQL + ' WHERE ' + @pFilter

    IF @pSort != '' AND @pSort IS NOT NULL
    SET @vSQL = @vSQL + ' ORDER BY ' + @pSort

    EXECUTE (@vSQL)

    -- Get the total number of rows selected
    SET @vTotalRows = @@ROWCOUNT

    -- If page number = 0, set it to the first page
    IF @pPage = 0
    SET @pPage = 1

    -- If page number is beyond the last page, set page to the last page
    IF (@pPage * @pPageRows) > @vTotalRows
    BEGIN
    SET @pPage = @vTotalRows / @pPageRows
    IF (@vTotalRows % @pPageRows) != 0
    SET @pPage = @pPage + 1
    END

    SET @vRowStart = ((@pPage - 1) * @pPageRows) + 1
    SET @vSQL = 'SELECT * FROM ' + @vTempTable + ' WHERE ROWID BETWEEN ' + CAST(@vRowStart AS VARCHAR(10)) +
    ' AND ' + CAST((@vRowStart + @pPageRows - 1) AS VARCHAR(10)) + ' ORDER BY ROWID'
    EXECUTE (@vSQL)

    SET @vSQL = 'DROP TABLE ' + @vTempTable
    EXECUTE (@vSQL)

GO

다음은 Northwing 데이터베이스를 사용하여 사용하는 방법에 대한 몇 가지 예입니다.

EXECUTE [dbo].[GetPage] 'Customers', '*', '', '', 1, 10
EXECUTE [dbo].[GetPage] 'Customers', '*', '', 'CustomerID DESC', 1, 10

확인하기 위해 이것은 내 일이 아니지만http://www.eggeadcafe.com/printsearchcontent.asp?linkid=1055

건배, 존

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top