Share via


매개 변수 및 실행 계획 재사용

ADO, OLE DB 및 ODBC 응용 프로그램의 매개 변수 표식을 포함하여 매개 변수를 사용하면 실행 계획을 좀 더 많이 재사용할 수 있습니다.

보안 정보보안 정보

또한 최종 사용자가 입력한 값을 갖는 매개 변수 또는 매개 변수 표식을 사용하는 것이 데이터 액세스 API 메서드, EXECUTE 문 또는 sp_executesql 저장 프로시저 중 하나를 사용하여 실행하는 문자열에 값을 연결하는 것보다 안전합니다.

다음의 두 SELECT 문 간의 유일한 차이점은 WHERE 절에서 비교된 값이 다르다는 것입니다.

SELECT * 
FROM AdventureWorks2008R2.Production.Product 
WHERE ProductSubcategoryID = 1;

SELECT * 
FROM AdventureWorks2008R2.Production.Product 
WHERE ProductSubcategoryID = 4;

이러한 쿼리에 대한 실행 계획 간의 유일한 차이점은 ProductSubcategoryID 열을 비교할 때 저장되는 값이 다르다는 것입니다. SQL Server에서 항상 해당 문이 기본적으로 동일한 계획을 생성하고 그 계획을 재사용한다는 것을 인식하게 하려는 것이 목적이지만 때때로 SQL Server는 복잡한 SQL 문에서 이러한 사실을 감지하지 못합니다.

매개 변수를 사용하여 SQL 문에서 상수를 분리하면 관계형 엔진이 중복된 계획을 인식하는 데 도움이 됩니다. 다음 방법으로 매개 변수를 사용할 수 있습니다.

  • Transact-SQL에서 sp_executesql을 사용합니다.

    DECLARE @MyIntParm INT
    SET @MyIntParm = 1
    EXEC sp_executesql
      N'SELECT * 
      FROM AdventureWorks2008R2.Production.Product 
      WHERE ProductSubcategoryID = @Parm',
      N'@Parm INT',
      @MyIntParm
    

    SQL 문을 동적으로 생성하는 Transact-SQL 스크립트, 저장 프로시저 또는 트리거에 대해서는 이 방법을 사용하는 것이 좋습니다.

  • ADO, OLE DB 및 ODBC는 매개 변수 표식을 사용합니다. 매개 변수 표식은 SQL 문의 상수를 대신하는 물음표(?)로 프로그램 변수에 바인딩됩니다. 예를 들어 ODBC 응용 프로그램에서는 다음을 수행합니다.

    • SQLBindParameter를 사용하여 SQL 문에서 정수 변수를 첫째 매개 변수 표식에 바인딩합니다.

    • 변수에 정수 값을 배치합니다.

    • 매개 변수 표식(?)을 지정하여 문을 실행합니다.

      SQLExecDirect(hstmt, 
        "SELECT * 
        FROM AdventureWorks2008R2.Production.Product 
        WHERE ProductSubcategoryID = ?",
        SQL_NTS);
      

      응용 프로그램에서 매개 변수 표식이 사용된 경우 SQL Server에 포함된 SQL Server Native Client OLE DB 공급자와 SQL Server Native Client ODBC 드라이버는 sp_executesql을 사용하여 문을 SQL Server로 보냅니다.

  • 기본적으로 매개 변수를 사용하는 저장 프로시저를 디자인합니다.

응용 프로그램 디자인 내에 매개 변수를 명시적으로 구축하지 않은 경우에는 단순 매개 변수화의 기본 동작을 사용하여 SQL Server 쿼리 최적화 프로그램에서 특정 쿼리를 자동으로 매개 변수화하도록 할 수 있습니다. 또는 ALTER DATABASE 문의 PARAMETERIZATION 옵션을 FORCED로 설정하여 데이터베이스의 모든 쿼리를 강제 매개 변수화하도록 쿼리 최적화 프로그램을 설정할 수도 있습니다. 자세한 내용은 강제 매개 변수화를 참조하십시오.

강제 매개 변수화를 설정한 경우에도 단순 매개 변수화가 계속해서 수행될 수 있습니다. 예를 들어 다음 쿼리는 강제 매개 변수화 규칙에 따라 매개 변수화할 수 없습니다.

SELECT * FROM Person.Address
WHERE AddressID = 1 + 2;

그러나 단순 매개 변수화 규칙에 따르면 매개 변수화할 수 있습니다. 강제 매개 변수화를 시도한 후 실패하면 그 다음으로는 단순 매개 변수화를 시도합니다.