당신이 게시 한 쿼리에서 :
select * from <table_name>;
ORDER BY를 지정하지 않았으므로 100 ~ 200 번째 행은 없습니다. 많은 흥미로운 이유로 ORDER BY를 포함시키지 않으면 주문이 보장되지 않지만 실제로는 그렇지 않습니다.
요점을 설명하기 위해 테이블을 사용하겠습니다. Stack Overflow 데이터 덤프 에서 Users 테이블을 사용 하고이 쿼리를 실행하겠습니다.
SELECT * FROM dbo.Users ORDER BY DisplayName;
기본적으로 DisplayName 필드에는 인덱스가 없으므로 SQL Server는 전체 테이블을 스캔 한 다음 DisplayName을 기준으로 정렬해야합니다. 실행 계획은 다음과 같습니다 .
약 30k의 서브 트리 비용이 추정되는 것은 많은 일입니다. PasteThePlan에서 select 연산자 위로 마우스를 가져 가면 알 수 있습니다. 따라서 100-200 행만 원하면 어떻게됩니까? 이 구문은 SQL Server 2012+에서 사용할 수 있습니다.
SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
그것에 대한 실행 계획 도 꽤 추악합니다.
SQL Server는 여전히 전체 테이블을 스캔하여 행 100-200을 제공하기 위해 정렬 된 목록을 작성하지만 비용은 여전히 약 30k입니다. 더 나쁜 것은이 전체 목록은 쿼리가 실행될 때마다 다시 작성됩니다 (결국 누군가가 자신의 DisplayName을 변경했을 수 있기 때문입니다).
더 빠르게하기 위해 DisplayName에 비 클러스터형 인덱스를 만들 수 있습니다.이 인덱스는 특정 필드를 기준으로 정렬 된 테이블의 복사본입니다.
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
해당 인덱스를 사용하여 쿼리의 실행 계획은 이제 인덱스 탐색을 수행합니다.
쿼리는 즉시 완료되며 예상 하위 트리 비용은 0.66입니다 (30k와 반대).
요약하면 자주 실행하는 쿼리를 지원하는 방식으로 데이터를 구성하면 SQL Server에서 바로 가기를 수행하여 쿼리 속도를 높일 수 있습니다. 반면에 힙이나 클러스터형 인덱스 만 있으면 문제가 생길 수 있습니다.