다음을 통해 공유


USE PLAN 쿼리 힌트 사용

USE PLAN 쿼리 힌트는 xml_plan을 인수로 사용합니다. xml_plan은 쿼리에 대해 생성된 XML 형식의 쿼리 계획으로부터 파생된 문자열 리터럴입니다. USE PLAN 쿼리 힌트는 독립 실행형 SQL 문에 쿼리 힌트로 지정하거나 계획 지침의 @hints 매개 변수에 지정할 수 있습니다. 계획 지침에 쿼리 계획을 추가하려면 sp_create_plan_guide 또는 sp_create_plan_guide_from_handle 저장 프로시저에서 xml_showplan 매개 변수를 사용하는 것이 좋습니다.

중요 정보중요

xml_plan은 N'xml_plan'과 같이 N 접두사를 지정하여 유니코드 리터럴로 나타내어야 합니다. 이렇게 하면 SQL Server 데이터베이스 엔진에서 문자열을 해석할 때 계획에서 유니코드 표준과 관련된 문자가 삭제되지 않도록 보장합니다.

SQL Server에서 XML 형식의 쿼리 계획은 다음 방식을 통해 생성할 수 있습니다.

  • SET SHOWPLAN_XML

    중요 정보중요

    SET SHOWPLAN_XML을 사용하여 쿼리 계획을 생성하는 경우 USE PLAN 쿼리 힌트로 계획을 사용하기 전에 계획에 따옴표(')가 사용된 경우 따옴표를 하나 더 찍어 이스케이프 처리해야 합니다. 예를 들어 WHERE A.varchar = 'This is a string'이 포함된 계획은 코드를 WHERE A.varchar = ''This is a string''으로 수정하여 이스케이프 처리해야 합니다.

  • SET STATISTICS XML

  • sys.dm_exec_query_plan 동적 관리 함수의 query_plan 열 쿼리

  • SQL Server 프로파일러 Showplan XML, Showplan XML Statistics ProfileShowplan XML For Query Compile 이벤트 클래스

쿼리 계획을 생성하고 분석하는 방법은 쿼리 분석을 참조하십시오.

xml_plan에 지정된 XML 형식의 쿼리 계획은 SQL Server 설치 디렉터리에 있는 XSD 스키마 Showplanxml.xsd에 대해 유효성을 검사해야 합니다. 또한 <ShowPlanXML> <BatchSequence> <Batch> <Statements> 요소가 포함된 경로 아래에서 다음 중 하나가 표시되어야 합니다.

  • 각각 정확히 하나의 <QueryPlan> 하위 요소가 포함된 하나 이상의 <StmtSimple> 요소

  • 정확히 하나의 <CursorPlan> 하위 요소가 있는 하나의 <StmtCursor> 요소

  • <QueryPlan> 하위 요소가 없는 하나 이상의 <StmtSimple> 요소 및 하나의 <CursorPlan> 하위 요소가 있는 하나의 <StmtCursor> 요소

계획을 사용하기 전에 조인 순서 및 연산자를 변경하거나 검색 및 찾기를 조정하는 등 USE PLAN을 사용하여 계획을 변경할 수 있습니다. 하지만 계획의 형식은 여전히 Showplanxml.xsd와 일치해야 합니다. 형식이 변경된 계획은 강제로 적용할 수 없습니다. SQL Server에서 최적화 중에 일반적으로 쿼리에 대해 고려되는 계획 중 하나가 아닌 계획을 USE PLAN에서 사용하면 오류가 발생합니다.

USE PLAN 쿼리 힌트를 사용하여 생성된 쿼리 계획은 다른 쿼리 계획과 마찬가지로 캐시됩니다.

USE PLAN 쿼리 힌트의 제한 사항

인덱스 삭제와 같이 데이터베이스가 변경되면 USE PLAN으로 지정된 쿼리 계획이 무효화될 수 있습니다. 계획에서 삭제된 개체가 직접적으로 참조되지 않는 경우에도 쿼리 계획을 사용하지 못할 수 있습니다. 예를 들어 쿼리 계획에서 명시적으로 참조되지 않는 고유 인덱스라도 데이터의 고유성 제약 조건을 강제로 적용할 수 있습니다. USE PLAN에서 참조되는 쿼리 계획은 이러한 제약 조건을 사용하여 차별성을 강제로 적용하는 특정 연산자 사용을 방지할 수 있습니다.

일부 경우에 SQL Server의 서비스 팩이나 새 버전을 설치하면 이전 버전에서 생성된 계획을 강제로 적용하지 못할 수 있습니다. 따라서 서버를 업그레이드할 때마다 모든 USE PLAN 힌트를 테스트해야 합니다.

쿼리에서 USE PLAN 힌트를 사용하면 동일 쿼리에서 사용되는 모든 조인 힌트와 인덱스 힌트가 무시됩니다.

USE PLAN은 SET FORCEPLAN이 ON으로 설정된 경우나 FORCE ORDER, EXPAND VIEWS, GROUP, UNION 또는 JOIN 쿼리 힌트와 사용할 수 없습니다.

쿼리 최적화 프로그램의 일반적인 검색 전략으로 찾을 수 있는 쿼리 계획만 USE PLAN을 사용하여 강제 적용할 수 있습니다. 이러한 계획은 일반적으로 각 조인의 자식이 리프 수준에 있도록 지정합니다. 다른 쿼리 유형을 강제 적용하도록 USE PLAN을 사용하면 오류가 발생합니다.

강제 적용된 쿼리 계획 요소

XML 형식의 쿼리 계획의 일부 요소는 USE PLAN 힌트로 강제 적용되지 않습니다. 스칼라 식을 계산하는 요소는 무시되므로 일부 관계형 식도 강제 적용되지 않습니다. 쿼리 계획은 다음 유형의 요소에 대해 강제 적용됩니다.

  • 계획 트리 구조 및 평가 순서

  • 조인 유형, 정렬 및 결합과 같은 실행 알고리즘

  • 검색, 찾기, 교집합 및 합집합과 같은 인덱스 연산

  • 다른 테이블, 인덱스 및 함수와 같이 명시적으로 참조되는 개체

특히 SQL Server는 <RelOp> 요소에 있는 LogicalOp, PhysicalOp 및 NodeID 항목을 강제 적용하며 <PhysicalOp> 연산자와 관련된 하위 요소도 강제 적용합니다. <RelOp> 요소에 있는 다른 내용은 USE PLAN에서 고려되지 않습니다.

중요 정보중요

<EstimateRows> 요소로 지정된 카디널리티 예측에 대한 정보는 USE PLAN 쿼리 힌트에서 강제 적용되지 않습니다. 쿼리 최적화 프로그램은 카디널리티 예측을 사용하여 쿼리 실행에 할당할 메모리 양을 결정하기 때문에 USE PLAN을 사용하는 경우에도 정확한 통계를 유지 관리해야 합니다. 자세한 내용은 통계를 사용하여 쿼리 성능 향상를 참조하십시오.

다음 표에서는 PhysicalOp 및 LogicalOp 항목에 대해 USE PLAN 쿼리 힌트로 강제 적용되는 관계형 연산자 값을 나열하고 각 PhysicalOp 값에 필요한 모든 하위 요소를 나열합니다. 표에는 하위 요소와 관련된 XPath 스타일 경로의 형식에 있는 각 연산자에 필요한 추가 정보가 포함되어 있습니다.

PhysicalOp

LogicalOp

하위 요소

추가 정보1

Concatenation

Concatenation

Async Concat

Concat

해당 사항 없음

Constant Scan

Constant Scan

ConstantScan

해당 사항 없음

Deleted Scan

Deleted Scan

DeletedScan

Object/@Table

UDX

UDX

Extension

@UDXName

Hash Match

Inner Join

Left Outer Join

Right Outer Join

Full Outer Join

Left Semi Join

Left Anti Semi Join

Right Semi Join

Right Anti Semi Join

Aggregate

Partial Aggregate

Flow Distinct

Union

Hash

해당 사항 없음

RID Lookup

RID Lookup

IndexScan

Object/@Database, Object/@Schema, Object/@Table

Index Scan

Clustered Index Scan

Index Scan

Clustered Index Scan

IndexScan

Object/@Database, Object/@Schema, Object/@Table Object/@Index

Index Seek

Clustered Index Seek

Index Seek

Clustered Index Seek

IndexScan

Object/@Database, Object/@Schema, Object/@Table Object/@Index

Inserted Scan

Inserted Scan

InsertedScan

Object/@Table

Log Row Scan

Log Row Scan

LogRowScan

해당 사항 없음

Merge Join

Inner Join

Left Outer Join

Right Outer Join

Full Outer Join

Left Semi Join

Left Anti Semi Join

Right Semi Join

Right Anti Semi Join

Cross Join

Concatenation

Union

Merge

해당 사항 없음

Merge Interval

Merge Interval

MergeInterval

해당 사항 없음

Nested Loops

Inner Join

Left Outer Join

Right Outer Join

Full Outer Join

Left Semi Join

Left Anti Semi Join

Right Semi Join

Right Anti Semi Join

Cross Join

NestedLoops

해당 사항 없음

Parallelism

Gather Streams

Repartition Streams

Distribute Streams

Parallelism

해당 사항 없음

Row Count Spool

Eager Spool

Lazy Spool

RowCountSpool2

해당 사항 없음

Segment

Segment

Segment

해당 사항 없음

Sequence

Sequence

Sequence

해당 사항 없음

Sequence Project

Compute Scalar

SequenceProject

해당 사항 없음

Sort

Sort

Distinct Sort

Sort

해당 사항 없음

Table Spool

Index Spool

Eager Spool

Lazy Spool

Spool2

@PrimaryNodeId(보조 스풀 전용)

../RelOp/@NodeId(기본 스풀을 나타내는 RelOps 전용)

Stream Aggregate

Aggregate

StreamAggregate

해당 사항 없음

Switch

Switch

Switch

해당 사항 없음

Table Scan

Table Scan

TableScan

Object/@Database, Object/@Schema, Object/@Table

Table-valued function

Table-valued function

TableValuedFunction

Object/@Database, Object/@Schema, Object/@Table

(테이블 반환 함수 이름은 Object/@Table)

Top

Top

Top

해당 사항 없음

Sort

Sort

Sort

해당 사항 없음

Top Sort

TopN Sort

TopSort

해당 사항 없음

Table Insert

Insert

Update

Object/@Table

1 USE PLAN으로 계획을 강제 적용하려면 테이블에 각 관계형 연산자에 대한 입력의 번호 및 순서가 표시되어야 합니다.

2 계획 강제 적용 기능은 계획에 <RowCountSpool> 하위 요소가 포함된 경우 강제 적용된 계획에 <RowCountSpool> 또는 <Spool> 하위 요소로 표시될 수 있다는 점에서 제한적입니다. 이와 비슷하게 계획에 <Spool> 하위 요소가 있는 경우 <Spool> 또는 <RowCountSpool> 하위 요소로 강제된 계획에 표시될 수 있습니다.

Assert, Bitmap, ComputeScalar 및 PrintDataFlow 연산자는 USE PLAN에서 무시됩니다. Filter 연산자는 USE PLAN에서 고려되지만 계획에서 연산자의 정확한 위치는 강제 적용되지 않습니다.

쿼리 계획에 사용된 논리 및 물리 연산자에 대한 자세한 내용은 논리 및 물리 연산자 참조를 참조하십시오.

커서 지원

USE PLAN 쿼리 힌트는 Transact-SQL 또는 API 커서 함수를 통해 요청되는 정적 또는 정방향 전용 커서를 지정하는 쿼리와 함께 사용할 수 있습니다. 정방향 전용 옵션이 있는 Transact-SQL 정적 커서가 지원됩니다. 동적의 키 집합 정방향 전용 커서는 지원되지 않습니다.

자세한 내용은 커서 쿼리에서 USE PLAN 쿼리 힌트 사용을 참조하십시오.