prosource

LINQ의 .Skip(1000)을 쓰는 방법순수 SQL로 취득(100)하시겠습니까?

probook 2023. 4. 13. 20:55
반응형

LINQ의 .Skip(1000)을 쓰는 방법순수 SQL로 취득(100)하시겠습니까?

에 해당하는 SQL은 무엇입니까?.Skip()LINQ의 메서드?

예를 들어 다음과 같습니다.특정 데이터베이스 테이블에서 1000~1100 행을 선택하고 싶습니다.

SQL만으로 가능합니까?아니면 테이블 전체를 선택하고 메모리에서 행을 찾아야 합니까?테이블이 꽤 클 수 있기 때문에 가능하면 피하고 싶습니다.

SQL Server 2012 이상에서는 다음 구문이 추가되었습니다.

SELECT *
FROM Sales.SalesOrderHeader 
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY

SQL Server 2005 이상에서는 ROW_NUMBER 함수를 사용할 수 있습니다.예:

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 51 AND 60; --BETWEEN is inclusive

LINQ to SQL은 ROW_NUMBER 창 기능을 사용하여 이를 수행합니다.

  SELECT a,b,c FROM 
   (SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number
    FROM Table) t0
   WHERE to.row_number BETWEEN 1000 and 1100;

이것은 동작합니다만, ORDER BY 로부터row_number 를 제조할 필요가 있는 경우, 서버측에서 쿼리가 정렬되어 퍼포먼스 문제가 발생할 수 있습니다.인덱스가 ORDER BY 요구 사항을 충족할 수 있는 경우에도 쿼리를 시작하기 전에 1000 행을 카운트해야 결과를 반환할 수 있습니다.개발자들은 이것을 잊어버리고 5백만 행의 테이블에 페이지 번호 컨트롤을 던져놓고 왜 첫 페이지가 마지막 페이지보다 훨씬 더 빨리 반환되는지 궁금해 합니다.

그래도 ROW_NUMBER()를 사용하는 것이 편리성과 퍼포먼스 사이에서 최적의 밸런스일 것입니다(ORDER BY 조건은 인덱스로 만족할 수 있습니다).

이것을 사용해 보세요.

select * from [Table-Name] order by [Column-Name] 
offset [Skip-Count] rows
FETCH NEXT [Take-Count] rows only

예:

select * from Personals order by Id
offset 10 rows            --------->Skip 10
FETCH NEXT 15 rows only   --------->Take 15

다음을 수행합니다.

.Skip(1000)을 실행합니다.LINQ의 (100)을 SQL datacontext로 가져와서 SQL 출력을 확인합니다.설명에 따라 SQL 문이 생성됩니다.

그렇게 우아하지는 않겠지만 일을 해낼 수 있다.

아니요, 하지만 MySQL의 LIMIT 절(Stack Overflow 링크)을 에뮬레이트하여 동일한 결과를 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/1744802/how-do-i-write-linqs-skip1000-take100-in-pure-sql

반응형