2011-03-17 9 views
5

stackoverflow에는 많은 SQL Server 페이징 질문이 있으며 그 중 많은 질문에 ROW_NUMBER() OVER (ORDER BY ...) AND CTE을 사용합니다. 수십만 개의 행에 들어가서 기본이 아닌 키 값에 정렬을 추가하고 사용자 정의 WHERE 절을 추가하기 시작하면 이러한 메서드가 매우 어려워집니다. 사용자 지정 정렬 및 필터링을 통해 페이지를 넘기 위해 노력하고있는 수백만 행의 데이터 집합이 있지만 필자가 정렬하고 필터링하는 모든 필드의 인덱스를 사용하더라도 성능이 떨어지고 있습니다. 나는 심지어 각각의 인덱스에 SELECT 컬럼을 포함하기까지 했었지만 데이터베이스가 간신히 도움이되었고 심각하게 비대 해졌습니다.Microsoft SQL Server 페이징

나는 stackoverflow 페이징이 어떤 정렬 기준이나 클릭 한 페이지 번호에 관계없이 약 500 밀리 초만 걸리는 것으로 나타났습니다. 누구나 수백만 행의 SQL Server 2008에서 페이징 작업을 효율적으로 수행하는 방법을 알고 있습니까? 여기에는 전체 행을 가능한 효율적으로 가져 오는 것이 포함됩니다. Best paging solution using SQL Server 2005?

+0

언제든지 검색어를 게시 할 수 있습니다. 일반 원칙은 좋은 사람이지만 현실 세계에서는 문제가 있습니다.) – u07ch

+0

정렬 (또는 필터링)하려는 모든 열에 인덱스를 추가하지 않습니까? 제게는 분명한 것처럼 보이지만, 시도했는지는 알 수 없습니다. – bart

+0

모든 열에 인덱스가 있습니다. 처음 몇 수천 넘어서 페이징 후, 질의 시간은 선형으로 올라 가기 시작합니다 ... – jjxtra

답변

5

누구나 수백만 개의 행과 SQL Server 2008의 효율적으로 페이징 작업을 만드는 방법을 알고 :

나의 현재 쿼리 페이징에 대한이 유래 질문과 동일한 논리가?

완벽한 완벽한 페이징을 원할 경우 각 레코드에 대해 색인 키 (위치 행 번호)를 작성하는 대신 사용할 수 없습니다. 그러나 대안이 있습니다. 페이지의

(1) 총 당신은 sysindexes.rows (거의 인스턴트)에서 근사치를 사용할 수 있습니다

  • (기록) 변화의 속도를 가정 작다.
  • 당신은

(2) 페이징이

(a)는
당신은 표시 할 수 있습니다 페이지 내에서 이동

향후 5 페이지를 말할 계산 두 번째 테이블 행에, 완전히 정확을 유지하기 위해 트리거를 사용할 수 있습니다 레코드의 어느 한쪽으로. 이들은 각면에서 최대 {page size} x 5 스캔해야합니다. 기본 쿼리가 정렬 순서를 따라 빠르게 이동하는 데 도움이되는 경우 느려서는 안됩니다. 그래서 기록 X 주어, 사용 이전 페이지로 이동할 수 있습니다 (가정 정렬 순서는 이전에 X에 기록)

a asc, b desc

select top(@pagesize) t.* 
from tbl x 
inner join tbl t on (t.a = x.a and t.b > x.b) OR 
        (t.a < a.x) 
where x.id = @X 
order by t.a asc, t.b desc 

(즉, 마지막 {페이지 크기가} 다시 다섯 페이지를 이동하는 것입니다

단점 :이 옵션을 사용하면 특정 위치로 바로 이동할 수 없으며 옵션은 처음 (쉬운) 옵션 일뿐입니다.이 옵션을 선택하면 해당 하위 쿼리에서 TOP (@pagesize * 5) , LAST (쉬운), NEXT/PRIOR, < 5면 양면

(b)
페이징이 항상 명확하고 예측 가능한 경우 행 번호에 간격이없는 INDEXED 뷰 또는 트리거 업데이트 된 테이블을 유지 관리하십시오. 테이블이 일반적으로 스펙트럼의 한쪽 끝에있는 업데이트 만 볼 수 있으며 삭제하지 않은 간격이 그리 많지 않은 레코드를 이동하여 쉽게 채워지는 경우이 옵션이 될 수 있습니다.

이 접근법은 행 수 (마지막 행)를 제공하고 모든 페이지에 대한 직접 액세스를 제공합니다.

+0

이것은 매우 잘 생각해 봤는데, 나는이 중 일부를 시도해 주셔서 감사합니다. – jjxtra

+1

결과의 총 수가 작을수록 (100K 미만) 내 Lucene 색인을 사용하여 페이징을 수행했습니다. SQL Server를 사용하면 높았습니다. SQL 서버는 거대한 테이블에 페이징 작은 결과 집합에 빠져. Lucene은 거대한 데이터 세트에서 작은 결과 세트를 페이징 할 때 유용합니다. – jjxtra

+0

SQL Server를 사용하여 얻을 수있는만큼 올바른 것으로 표시 할 수 있습니다. 위에서 언급 한 하이브리드 방식은 매우 잘 작동합니다. – jjxtra

관련 문제