'SELECT TOP'성능 질문


18

select top 100를 사용하면 훨씬 더 빠르게 실행 하고을 사용하지 않으면 훨씬 느리게 실행되는 쿼리가 top 100있습니다. 반환 된 레코드 수는 0입니다. 쿼리 계획의 차이점을 설명하거나 이러한 차이점이 설명 된 링크를 공유 할 수 있습니까?

top텍스트가 없는 쿼리 :

SELECT --TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

위의 쿼리 계획 (제외 top) :

https://pastebin.com/cbtJpxFf

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

IO 및 TIME 통계 (제외 top) :

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'INVENTDIM'. Scan count 0, logical reads 988297, physical reads 0, read-ahead reads 1, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 1, logical reads 1234560, physical reads 0, read-ahead reads 14299, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 6256 ms,  elapsed time = 13348 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

사용 된 색인 (제외 top) :

1. INVENTTRANS.I_177TRANSIDIDX
   4 KEYS:
 - DATAAREAID
 - INVENTTRANSID
 - INVENTDIMID
 - RECID
2. INVENTTRANS.I_177ITEMIDX
   3 KEYS:
   - DATAAREAID
   - ITEMID
   - DATEPHYSICAL 
3. INVENTDIM.I_698DIMIDIDX
   2 KEYS:
   - DATAAREAID
   - INVENTDIMID

의 쿼리 top:

SELECT TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

쿼리 계획 (TOP 포함) :

https://pastebin.com/0dyu6QZd

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


쿼리 IO 및 TIME 통계 (TOP 포함) :

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 15385, logical reads 82542, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTDIM'. Scan count 1, logical reads 62704, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 265 ms,  elapsed time = 257 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

사용 된 인덱스 (TOP 사용) :

 1. INVENTTRANS.I_177TRANSIDIDX
     4 KEYS:
     - DATAAREAID
     - INVENTTRANSID
     - INVENTDIMID
     - RECID
 2. INVENTTRANS.I_177DIMIDIDX
    3 KEYS:
    - DATAAREAID
    - INVENTDIMID
    - ITEMID
 3. INVENTDIM.I_698DIMIDIDX
    2 KEYS:
    - DATAAREAID
    - INVENTDIMID
 4. INVENTDIM.I_698ECC_BUSUNITLOCIDX
    3 KEYS
    - DATAAREAID
    - ECC_BUSINESSUNITID
    - INVENTLOCATIONID

주제에 대한 도움을 깊이 감사하겠습니다!


2
'ORDER BY'가없는 'TOP'의 속도는 중요하지 않다고 생각합니다. 속도보다 정확한 결과가 중요합니다.
Dan Guzman

답변:


15

SQL Server는 다른 정렬 알고리즘을 사용하여 TOP 100에 대한 다른 실행 계획을 작성합니다. 때로는 더 빠르며 때로는 더 느립니다.

더 간단한 예는 한 행이 쿼리 계획을 얼마나 많이 변경할 수 있습니까?를 읽으십시오 . 1 부2 부 .

자세한 기술 정보와 TOP 100 알고리즘이 실제로 느린 위치에 대한 예는 Paul White의 정렬, 행 목표 및 TOP 100 문제를 읽으십시오 .

결론 : 귀하의 경우, 행이 반환되지 않는다는 것을 알고 있다면 ... 음 ...을 실행하지 마십시오. 가장 빠른 쿼리는 결코 만들 수없는 쿼리입니다. 그러나 존재 확인을 수행 해야하는 경우 IF EXISTS (여기서 쿼리 스틱)를 수행하면 SQL Server가 다른 실행 계획을 수행합니다.


고마워, 나는 그것을 확실히 읽을 것이다. 또한 두 시나리오에서 행 추정값이 올바르지 않다는 것을 알았습니다. 무엇과 연결될 수 있습니까? 괜찮다면 통계-두 클러스터 인덱스에서 fullscan 옵션으로 통계를 업데이트했습니다.
George K

또한-주문이 없기 때문에 내 경우에 적합하므로 계획에 SORT가 없을 것이라고 생각합니까?
George K

실행 계획이 TOP 100과 TOP 101 모두에 대해 동일한 지 확인하는 것이 매우 흥미로울 것입니다. 가능하면 공유하십시오. 감사.
Artashes Khachatryan

@GeorgeK Dynamics AX를 사용하고 있음을 알 수 있습니다. 많은 추정 문제로 이어질 수있는 추적 플래그 [ blogs.msdn.microsoft.com/axinthefield/… 를주의하십시오. 추적 플래그 4136이 비활성화 된 경우 인덱스에서 "파티션"열이 첫 번째인지 확인하십시오. 파티션에는 일반적으로 고유 값이 거의 없습니다.
한스 베이더

9

두 가지 계획을 살펴보면 비용이 크게 다른 두 가지를 모두 살펴볼 수 있습니다. 객체 위로 마우스를 가져 가면 실행 횟수가 표시됩니다.

키 검색은 인덱스 검색 (오른쪽 상단)에 사용 된 인덱스가 모든 열을 다루지 않으므로 클러스터형 인덱스를 다시 찾는 것입니다 (선택 *이므로 클러스터형 인덱스를 사용해야 함).

상위 100 개는 인덱스에서 적은 수의 읽기에 필요한 100 개의 행을 가져온 다음 테이블의 모든 행이 아닌 100 회 조회를 수행 할 수 있습니다. '상단'을 수행하지 않을 때 읽은 페이지 수의 증가에 대해서도 설명합니다.

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