답변:
이와 같은 것에 대해 궁금한 경우 쿼리의 실행 계획을 비교해야합니다.
쿼리 실행 계획의 모양은 테이블에있는 행 수와 정의 된 인덱스에 따라 다릅니다.
성능에 차이가없는 것을 보여주는 한 가지 시나리오 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
*******************