SELECT 문에서 OPTION FAST의 기능은 무엇입니까?


29

OPTION (FAST XXX)쿼리 힌트가 SELECT명령문 내 에서 수행하는 작업에 대해 파고 들었지만 여전히 혼란 스럽습니다. MSDN에 따르면 :

쿼리가 첫 번째 number_rows의 빠른 검색을 위해 최적화되도록 지정합니다. 음이 아닌 정수입니다. 첫 번째 number_rows가 반환 된 후 쿼리는 실행을 계속하고 전체 결과 집합을 생성합니다.

나에게는별로 이해가되지 않지만 기본적으로 쿼리는 첫 번째 XXX 행을 실제로 빠른 속도로 유지하고 나머지는 정상적인 속도로 얻을 수 있습니까?

이것에 대해 생각하게 한 Microsoft Dynamics 쿼리는 다음과 같습니다.

select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid
from pjproj WITH (NOLOCK)
where project like  '%'
order by project OPTION(FAST 500)

누구나이 쿼리 힌트가 무엇을하는지 정확하게 설명 할 수 있으며 그것을 사용하지 않는 것보다 이점이 있습니까?

답변:


24

A는 FAST N빠르게로 정의 행의 수를 반환하여 실행 계획을 생성하는 SQL 서버를 말할 것이다 N.

NSQL Server에 N가능한 한 빨리 행 을 검색하도록 지시하기 때문에 추정치는 추정에 따릅니다 .

fast 500:

-- total rows : 19972
 SELECT [BusinessEntityID]
      ,[TotalPurchaseYTD]
      ,[DateFirstPurchase]
      ,[BirthDate]
      ,[MaritalStatus]
      ,[YearlyIncome]
      ,[Gender]
      ,[TotalChildren]
      ,[NumberChildrenAtHome]
      ,[Education]
      ,[Occupation]
      ,[HomeOwnerFlag]
      ,[NumberCarsOwned]
  FROM [AdventureWorks2012].[Sales].[vPersonDemographics]
  order by BusinessEntityID
  option (fast 500)

예상 대 실제 행 option (fast 500)

여기에 이미지 설명을 입력하십시오

없는 대 실제 행 option (fast 500)

여기에 이미지 설명을 입력하십시오

사용 사례는 응용 프로그램 (백그라운드에서 데이터를로드 많은 양의) 캐싱을하고 가능한 한 빨리으로 사용자에게 데이터의 조각을 보여주고 싶어하면 될 것이다.

또 다른 흥미로운 유스 케이스는 SSIS 토지에서 Rob FarleyFAST N 가 데이터 검색 속도를 높이는 촉매제로 사용 한다고 설명 합니다.

이 힌트를 추가하면 쿼리에서 마술 지팡이가 흔들려 여러 번 더 빠르게 실행되는 것처럼 느껴졌습니다.

Remus Rusanu의 답변도 참조하십시오 .


11

이 쿼리 힌트 OPTION (FAST n)을 사용할 때 옵티마이 저는 가능한 한 가장 빠른 방식으로 해당 양의 레코드를 반환 할 수있는 실행 계획을 선택합니다. 일반적으로 옵티마이 저는 완전한 결과 집합을 효율적으로 반환 할 수있는 경로를 결정하려고합니다. 따라서 일련의 행을 신속하게 다시 가져 오려면이 행을 사용하여 검색 할 수 있지만 대부분의 경우이 힌트를 사용하면 전체 결과 세트가 느려져서 옵티마이 저가 계획을 수행하도록 할 수 있습니다 그래서.

유스 케이스를 자세히 설명하기 위해 결합 해야하는 상당히 큰 두 개의 테이블이있을 수 있지만 그중 하나에서 작업 해야하는 데이터 세트는 더 작습니다. 이 경우 추가 인덱스 / 오버 헤드를 만들지 않고 더 큰 테이블에서 FAST를 사용하면 SQL이 백그라운드에서 거대한 해시 테이블을 만들 수 있습니다.


2

몇 년 전 Dynamics AX에서 성능 문제를 조사 할 때 같은 질문에 부딪 쳤습니다. Microsoft의 설명에 따라 힌트에 의해 실행되는 다른 실행 계획을 볼 수 있으며 이것은 여기에 주어진 다른 답변에 해당합니다.

힌트를 통해 SQL Server는 모든 레코드를 읽기 (및 잠재적으로 정렬)해야하는 실행 계획 대신 예를 들어 중첩 루프에서 나오는 결과 스트리밍을 허용하는 실행 계획을 찾으려고합니다. 출력되고 있습니다.

필자의 경우 유일한 문제는 SQL 서버가 힌트를 사용할 때 결과를 반환하는 데 항상 (수 많은) 분이 걸리는 반면 쿼리는 힌트없이 몇 초 만에 결과 (전체 결과 집합)를 반환한다는 것입니다. 예상했다. 나는 개인적 으로이 힌트를 매우 신중하게 사용하고 Dynamics 환경과 같은 모든 형태 (더 이상은 아닙니다)에서 체계적으로 사용하지는 않습니다.

따라서 OP에 대답하기 위해 많은 힌트와 마찬가지로 쿼리가 수행 해야하는 것처럼 쿼리를 개선하는 데 도움이되는 것은 아닙니다 (테스트, 테스트, 테스트!)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.