urini
그는 물었다 12년 전
11

결과가 어떻게 반환되기를 페이지의 SQL?

많은 데이터베이스 테이블에서 데이터를 표시하는 애플리케이션마다 격자선 한 번에 한 페이지. 또한 그들 중 많은 수가 강조표시할 사용자가 원하는 열, 앞뒤로 후 페이지당 기준 기록을 통해 결과를 얻을 수 있습니다.

39 의 패턴을 구현하기 위한 좋은 알고리즘입니다 what& 전체 표를 주지 않으면서 클라이언트뿐 그리곤요 필터링하면 데이터 클라이언트상의. 그냥 레코드전자문서의 어떻게 들고왔나 표시할 수 사용자이십니까?

Linq 높여줍니까 간편해집니다 솔루션이므로?

답변 8 개

Ms SQL Server 2005년 잔인하니 ROW_NUMBER () 작동합니까 것으로 보인다.

T-SQL. 함께 페이징의 ROW_NUMBER ()

DECLARE @PageNum AS INT;
DECLARE @PageSize AS INT;
SET @PageNum = 2;
SET @PageSize = 10;

WITH OrdersRN AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
          ,OrderID
          ,OrderDate
          ,CustomerID
          ,EmployeeID
      FROM dbo.Orders
)

SELECT * 
  FROM OrdersRN
 WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 
                  AND @PageNum * @PageSize
 ORDER BY OrderDate
         ,OrderID;

Lukas Eder
그는 7년 전 댓글을 달았습니다
2

& # 39 row_number () '또는' 페이징의 에뮬레이션, sql server 2012년 의 '오프셋입니다. 수 많은 페치할 '조항이 매우 느린 페이지 번호: http://www.4guysfromrolla.com/webtech/042606-1.shtml. 이 경우, [말라실로 방법] (http://stackoverflow.com/a/19610367/521799) 에 대한 더 나은 선택을 있을 수 있기 때문에, 페이징의 상수입니다 하게하면서요.

39 를 사용하거나, LINQ, 또는 어떤 i& 속도입니다.4 추천합니까 시도하시겠습니까 복제본에 않니다. # 39, ve got i& app 어디서 list. LINQ 시행하십시오 메서드을 건너띄기 읽어들이려면 페이징되는지 및 데이터. 이 코드는 이 같은 일이.

MyDataContext db = new MyDataContext();
var results = db.Products
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize);

Sql Server 를 실행하는 LINQ 는 SQL 로 변환 프로필러 사실을 이 질의에서는 비슷한:

SELECT [ProductId], [Name], [Cost], and so on...
FROM (
    SELECT [ProductId], [Name], [Cost], [ROW_NUMBER]
    FROM (
       SELECT ROW_NUMBER() OVER (ORDER BY [Name]) AS [ROW_NUMBER], 
           [ProductId], [Name], [Cost]
       FROM [Products]
    )
    WHERE [ROW_NUMBER] BETWEEN 10 AND 20
)
ORDER BY [ROW_NUMBER]

분명 (영어:

  1. 추가 기능을 사용하여 해당 행, 행 번호 순서대로 필터링합니다 ROW_NUMBER 운영까지도.
  2. 필터 (1) 만 페이지에 반환되기를 행일 숫자임 운영까지도.
  3. (2) 에 정렬 순서를 동일합니까 행 번호, 이는 당신이 원하는 (이 경우 이름으로).
Lukas Eder
그는 7년 전 댓글을 달았습니다
1

실제 '선택' do you know why LINQ 두 일이 아주 기술서임을? 은 (는?) 그 미묘한 성능 면변형 일부 SQL Server 버전? 1 차 2 단계 느낌이 결합할 수 있다.

기본적으로 두 가지 방법이 있는데 하고 쪽매김 데이터베이스 (I& # 39 m, 가정, re you& # 39 사용하여 SQL Server):

오프셋할 사용하여

다른 %s/dbase/ext_table. ROW_NUMBER () 함수 () '순위' 를 통해 설명한 레온티에프의 페이징에 수행하는 데 사용할 수 있습니다. # 39 의 가치가 있는 it& 거론하며 SQL 표준 SQL Server 2012년 마지막으로 에 대한 지원을 '오프셋입니다. 페치할 ' 절:

SELECT first_name, last_name, score
FROM players
ORDER BY score DESC
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY

39 SQL Server 2012년 사용 및 이전 버전과의 호환성 문제가 되지 않는 경우, re you& 합니다 아마도 이 조항 때문에 포지셔닝하십시오 실행됨을 SQL Server 에 의해 더욱 최적화된 솔루션 코너 건이다.

말라실로 방법을 사용하여

There is an 덜 알려져 있지만, 완전히 다른, 훨씬 더 빠르게 수행할 수 있는 페이징의 SQL. 이것은 종종 &quot 말라실로 method&quot,) 이라고 한다. 설명대로 이 블로그 포스트는 여기.

SELECT TOP 10 first_name, last_name, score
FROM players
WHERE (score < @previousScore)
   OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC

이 값은 레코드 '와' '마지막' @previousScore @previousPlayerId 값을 각각 이전 페이지의. 이 &quot, next&quot 페치할 수 있습니다. 호출이네요 Order BY 경우 '는' ',', '대신' &gt 방향선이 ASC 사용하여 간단히.

위의 방법을 통해 4 페이지 이동 없이 즉시 delaymins 첫 반입됨 이전 40 레코드는유지합니다. 건너뛰려면 훨씬 많지만, 원하지 않는 겁니다. 그 대신 훨씬 빠르게 할 수 있을 수 있는 시간을 확보하십시오 쿼리하지 페치할 data-in 상수입니다 따라 인덱스화를. 또한, 기본 데이터 변경, stable&quot 상관없이 페이지에 &quot 거주하리라 경우 (예를 들어 1 페이지에서 동시에 you& # 39, re on 4 페이지).

이것은 웹 애플리케이션을 구현할 때 가장 좋은 방법은 더 data-in 페이징의 게으른 로드중, 예를 들어.

Note 를 &quot 말라실로 method"; [크리스트 페이징의] 는 eschweiler-clarke (https://stackoverflow.com/a/3215973/521799).

LINQ 와 익명 클래스에서 람다 표현식 및 .Net 3.5 hugely 단순화됩니다 이러한 종류의 것.

쿼리하지 데이터베이스입니까:

var customers = from c in db.customers
                join p in db.purchases on c.CustomerID equals p.CustomerID
                where p.purchases > 5
                select c;

레코드 수가 당 페이지:

customers = customers.Skip(pageNum * pageSize).Take(pageSize);

모든 열에 의해 정렬:

customers = customers.OrderBy(c => c.LastName);

선택된 필드만 가져오는 서버에서:

var customers = from c in db.customers
                join p in db.purchases on c.CustomerID equals p.CustomerID
                where p.purchases > 5
                select new
                {
                    CustomerID = c.CustomerID,
                    FirstName = c.FirstName,
                    LastName = c.LastName
                };
이 익명 클래스에서 속성에 액세스할 수 있는 정적으로 입력되었는지 만듭니다.

var firstCustomer = customer.First();
int id = firstCustomer.CustomerID;

결과가 나올 수 있으므로, t # 39 는 기본적으로 쿼리합니다 게으른 로드됨 aren& 스토리지스코프는 때까지 데이터를 데이터베이스에 대한 실제 필요한. Net 에서는 linq 의 등도 크게 단순화됩니다 유지하면, 단 한 업데이트뿐 다타콘테스트 변경 사항이 있는 업데이트하려면 필드용 변경할 수 있습니다.

Snowy
그는 10년 전 댓글을 달았습니다
0

첫 번째 기술서임을 뒤로를 당기십시오 설명하였노라 DB 에서 다음 두 번째 기술서임을 서브세트 얻을 것으로 보인다. 만약 당신이 그냥 서브세트 제일? 나는 그냥 90,000 행과 4 페이지) 10 행.

Adam Lassek
그는 10년 전 댓글을 달았습니다
0

39 는 LINQ 첫 번째, 실제로 doesn& 호출하십시오 @scsub 표현식에서는 게으른 로드됨 도왔으매 처음에는 아무 짓도 하지 않을 수 없다. 고객의 = 고객들입니다 호츨 수 있습니다. (30) 건너띄기 스타크 (10) '와 뒤로를 당기십시오 그리웠댔지 것이다.

내가 몇 가지 솔루션을 사용할 수 있는 MS SQL 2005년.

그 중 하나가 ROW_NUMBER () 는. 하지만 개인적으로 don& ROW_NUMBER (), t, t # 39 와 같은 doesn& # 39 사용할 수 있기 때문에 큰 결과를 (DB 어떤 난 작동합니까 가 굉장히 큰 - 1TB 이상의 데이터 실행 - 두 번째 ᅳ 아시다시피 수천 명의 쿼리합니다 대량량 소셜 네트워킹 사이트).

여기 내 좋아하는 솔루션입니다.

내아기마저도 종류의 코드를 사용하여 dtep T-SQL.

39 의 사용자 이름, 성, let& 2 페이지 정렬되어 있는 10 개의 각 페이지를 찾을 레코드는유지합니다.

@page = 2 -- input parameter
@size = 10 -- can be optional input parameter

if @page < 1 then begin
    @page = 1 -- check page number
end
@start = (@page-1) * @size + 1 -- @page starts at record no @start

-- find the beginning of page @page
SELECT TOP (@start)
    @forename = forename,
    @surname = surname
    @id = id
FROM
    users
ORDER BY
    forename,
    surname,
    id -- to keep correct order in case of have two John Smith.

-- select @size records starting from @start
SELECT TOP (@size)
    id,
    forename,
    surname
FROM
    users
WHERE
    (forename = @forename and surname = @surname and id >= @id) -- the same name and surname, but bigger id
    OR (forename = @forename and surname > @surname) -- the same name, but bigger surname, id doesn't matter
    OR (forename > @forename) -- bigger forename, the rest doesn't matter
ORDER BY
    forename,
    surname,
    id

오라클 솔루션을:

select * from (
    select a.*, rownum rnum from (
        YOUR_QUERY_GOES_HERE -- including the order by
    ) a
    where rownum <= MAX_ROW
 ) where rnum >= MIN_ROW

사실, LINQ 와 결합할 수 있는 방법을 선택할 수 있는 기록은 반입됨 건너띄기 시행하십시오 있다.

이러한 확인란 초과됩니다.

Db 관련. [쪽매김 SQL Server 2005년] (http://www.singingeels.com/Articles/Pagination_In_SQL_Server_2005.aspx)

이에 대해 토론을 할 수는 없을 것 Here

이 기법은 데이터베이스 gets 에서 150,000 선 78ms 의 페이지 번호 100,000

&gt. 즉, 첫 페이지에: employeeid 로카운트 사용하여 최적화기 지식과 설정되었습니다 저장됩니까 요청되었습니다 는 로컬 변수 kingdome. seattle. 될 수 있습니다. 로카운트 설정할 수 있는 최대 레코드 다음, 즉 요청되었습니다 @maximumRows. 이 결과 집합을 페이징의 보다 효율적으로 사용할 수 있습니다. 또한 기존 인덱스화합니다 때문에 이 방법을 사용하여 테이블에서 활용하여 직접 댁이라면 기본 테이블 아닌 로칼에서 만든 테이블.

나는 내가 두렵도 판단할 수 없는 경우 현재 수락됨 오토메이티드 것보다 낫다.

Lukas Eder
그는 7년 전 댓글을 달았습니다
0

다른 매우 빠르게 외곽진입 은 [말라실로 방법] (http://stackoverflow.com/a/19610367/521799) 에서 할 수 있는 시간 (어쩌면 가장 빠른 속도로 78ms) 에 쪽수를 매기다 상수입니다