계획 지침을 사용하여 쿼리 매개 변수화 동작 지정

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

PARAMETERIZATION 데이터베이스 옵션을 SIMPLE로 설정하면 SQL Server 쿼리 최적화 프로그램에서 쿼리를 매개 변수화하도록 선택할 수 있습니다. 즉, 쿼리에 포함된 모든 리터럴 값은 매개 변수로 대체됩니다. 이 프로세스를 단순 매개 변수화라고 합니다. SIMPLE 매개 변수화가 적용되는 경우 매개 변수가 있는 쿼리와 매개 변수가 없는 쿼리를 제어할 수 없습니다. 그러나 PARAMETERIZATION 데이터베이스 옵션을 FORCED로 설정하여 데이터베이스의 모든 쿼리를 매개 변수화하도록 지정할 수 있습니다. 이 프로세스를 강제 매개 변수화라고 합니다.

다음 방법으로 계획 지침을 사용하여 데이터베이스의 매개 변수화 동작을 무시할 수 있습니다.

  • PARAMETERIZATION 데이터베이스 옵션이 SIMPLE로 설정된 경우 특정 쿼리 클래스에서 강제 매개 변수화가 시도되도록 지정할 수 있습니다. 이렇게 하려면 매개 변수가 있는 형식의 쿼리에 대한 TEMPLATE 계획 가이드를 만들고 sp_create_plan_guide 저장 프로시저에서 PARAMETERIZATION FORCED 쿼리 힌트를 지정합니다. 이러한 종류의 계획 가이드를 모든 쿼리가 아닌 특정 쿼리 클래스에서만 강제 매개 변수화를 사용하도록 설정하는 방법으로 간주할 수 있습니다. 간단한 매개 변수화에 대한 자세한 내용은 쿼리 처리 아키텍처 가이드를 참조하세요.

  • PARAMETERIZATION 데이터베이스 옵션을 FORCED로 설정하면 특정 쿼리 클래스에 대해 강제 매개 변수화가 아닌 단순 매개 변수화만 시도되도록 지정할 수 있습니다. 이렇게 하려면 매개 변수가 강제로 지정된 쿼리 형식에 대한 TEMPLATE 계획 지침을 만들고 PARAMETERIZATION SIMPLE 쿼리 힌트를 sp_create_plan_guide에 지정합니다. 강제 매개 변수화에 대한 자세한 내용은 쿼리 처리 아키텍처 가이드를 참조하세요.

데이터베이스에서 다음 쿼리를 AdventureWorks2022 고려합니다.

SELECT pi.ProductID, SUM(pi.Quantity) AS Total  
FROM Production.ProductModel AS pm   
    INNER JOIN Production.ProductInventory AS pi   
        ON pm.ProductModelID = pi.ProductID   
WHERE pi.ProductID = 101   
GROUP BY pi.ProductID, pi.Quantity HAVING SUM(pi.Quantity) > 50;  

데이터베이스 관리자는 데이터베이스의 모든 쿼리에서 강제 매개 변수화를 사용하도록 설정하지 않기로 결정했습니다. 그러나 이전 쿼리와 구문상 동일하지만 상수 리터럴 값만 다른 모든 쿼리에서 컴파일 비용을 방지하려고 합니다. 즉, 이러한 종류의 쿼리에 대한 쿼리 계획을 다시 사용할 수 있도록 쿼리를 매개 변수화하려고 합니다. 이 경우 다음 단계를 완료합니다.

  1. 매개 변수가 있는 형식의 쿼리를 검색합니다. sp_create_plan_guide 사용하기 위해 이 값을 가져오는 유일한 안전한 방법은 sp_get_query_template 시스템 저장 프로시저를 사용하는 것입니다.

  2. PARAMETERIZATION FORCED 쿼리 힌트를 지정하여 매개 변수가 있는 형식의 쿼리에 대한 계획 지침을 만듭니다.

    Important

    쿼리 매개 변수화의 일환으로 SQL Server는 리터럴의 값과 크기에 따라 리터럴 값을 대체하는 매개 변수에 데이터 형식을 할당합니다. sp_get_query_template @stmt 출력 매개 변수에 전달된 상수 리터럴 값과 동일한 프로세스가 발생합니다. sp_create_plan_guide@params 인수에 지정된 데이터 유형이 SQL Server에 의해 매개 변수화된 쿼리의 데이터 유형과 일치해야 하므로 쿼리에 사용할 수 있는 매개 변수 값의 전체 범위를 포함하는 계획 지침을 두 개 이상 만들어야 할 수 있습니다.

다음 스크립트를 사용하여 매개 변수가 있는 쿼리를 가져온 다음 계획 지침을 만들 수 있습니다.

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT pi.ProductID, SUM(pi.Quantity) AS Total   
      FROM Production.ProductModel AS pm   
      INNER JOIN Production.ProductInventory AS pi ON pm.ProductModelID = pi.ProductID   
      WHERE pi.ProductID = 101   
      GROUP BY pi.ProductID, pi.Quantity   
      HAVING sum(pi.Quantity) > 50',  
    @stmt OUTPUT,   
    @params OUTPUT;  
EXEC sp_create_plan_guide   
    N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  

마찬가지로 강제 매개 변수화가 이미 사용하도록 설정된 데이터베이스에서 샘플 쿼리와 해당 상수 리터럴 값을 제외하고 구문적으로 동등한 다른 쿼리가 단순 매개 변수화 규칙에 따라 매개 변수화되도록 할 수 있습니다. 이렇게 하려면 OPTION 절에 PARAMETERIZATION FORCED 대신 PARAMETERIZATION SIMPLE을 지정합니다.

참고 항목

TEMPLATE 계획 지침은 단일 문으로만 구성된 일괄 처리로 제출된 쿼리와 문 일치를 안내합니다. 다중 상태 일괄 처리 내의 문은 TEMPLATE 계획 가이드에서 일치시킬 수 없습니다.