하위 쿼리에서 DISTINCT를 힌트로 사용하는 것이 유용한가요?


18

DISTINCT다음 예를 추가 하면 쿼리 실행 시간에 영향이 있습니까?
때로는 힌트로 사용하는 것이 현명합니까?

SELECT *
FROM   A
WHERE  A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B) 

답변:


25

이와 같은 것에 대해 궁금한 경우 쿼리의 실행 계획을 비교해야합니다.

쿼리 실행 계획의 모양은 테이블에있는 행 수와 정의 된 인덱스에 따라 다릅니다.
성능에 차이가없는 것을 보여주는 한 가지 시나리오 A는에 있는 것보다 많은 행이있는 경우입니다 B. 그런 다음 옵티마이 저는 B에 대해 중첩 루프 조인에서 구동 테이블 로 선택합니다 A. 올바른 결과 B를 얻으려면 두 쿼리에서 모두 테이블 에 스트림 집계를 사용하여 에서 고유 한 행만 가져와야 B합니다. 따라서이 경우 고유 키워드는 성능에 영향을 미치지 않습니다.

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

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

테스트해야 할 다른 두 가지 명백한 경우에 대한 실행 계획, A보다 B의 행이 더 많고 테이블의 행 수가 동일하면 쿼리에 대한 동일한 실행 계획이 표시됩니다.

최신 정보

쿼리 최적화가 수행되기 전에 쿼리는 단순화 단계를 거칩니다. 추적 플래그 8606을 사용하여 논리 트리의 모양을 볼 수 있습니다.

쿼리의 입력 트리는 분명히 다르지만 단순화 후에는 동일합니다.

참조 : 문서화되지 않은 Query Optimizer 추적 플래그Query Optimizer Deep Dive – 2 부

distinct를 사용하여 쿼리를위한 입력 트리 및 단순화 된 트리 :

*** Input Tree: ***
        LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
            LogOp_Select
                LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
                ScaOp_SomeComp 2
                    ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                    LogOp_GbAgg OUT(QCOL: [xx].[dbo].[B].SomeColumn,) BY(QCOL: [xx].[dbo].[B].SomeColumn,)
                        LogOp_Project
                            LogOp_Project
                                LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
                                AncOp_PrjList 
                            AncOp_PrjList 
                        AncOp_PrjList 
            AncOp_PrjList 
*******************
*** Simplified Tree: ***
        LogOp_LeftSemiJoin
            LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
            LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
            ScaOp_Comp x_cmpEq
                ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************

고유 하지 않은 쿼리를위한 입력 트리 및 단순화 된 트리 :

*** Input Tree: ***
        LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
            LogOp_Select
                LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
                ScaOp_SomeComp 2
                    ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                    LogOp_Project
                        LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
                        AncOp_PrjList 
            AncOp_PrjList 
*******************
*** Simplified Tree: ***
        LogOp_LeftSemiJoin
            LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
            LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
            ScaOp_Comp x_cmpEq
                ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.