다음을 통해 공유


SQL 문 준비

SQL Server 관계형 엔진에서는 SQL 문을 실행하기 전에 문을 준비할 수 있는 기능을 제공합니다. 응용 프로그램에서 SQL 문을 여러 번 실행해야 하는 경우에는 데이터베이스 API를 사용하여 다음을 수행할 수 있습니다.

  • 문을 한 번 준비합니다. 이렇게 하면 SQL 문이 실행 계획으로 컴파일됩니다.

  • 문을 실행해야 할 때마다 미리 컴파일한 실행 계획을 실행합니다. 이렇게 하면 첫 번째 실행 이후 실행할 때마다 SQL 문을 다시 컴파일할 필요가 없습니다.

    문 준비 및 실행은 API 함수 및 메서드에 의해 제어됩니다. 이것은 Transact-SQL 언어의 일부분이 아닙니다. SQL 문 실행에 대한 준비/실행 모델은 SQL Server Native Client OLE DB 공급자 및 SQL Server Native Client ODBC 드라이버에 의해 지원됩니다. 준비 요청 시, 공급자 또는 드라이버는 문 준비 요청과 함께 해당 문을 SQL Server에 보냅니다. SQL Server는 실행 계획을 컴파일하고 공급자 또는 드라이버에 해당 계획에 대한 핸들을 반환합니다. 실행 요청 시, 공급자 또는 드라이버는 핸들과 관련된 계획의 실행 요청을 서버에 보냅니다.

준비된 문은 SQL Server에서 임시 개체를 만드는 데 사용할 수 없습니다. 준비된 문은 임시 테이블과 같은 임시 개체를 만드는 시스템 저장 프로시저를 참조할 수 없습니다. 이러한 프로시저는 직접 실행되어야 합니다.

준비/실행 모델을 과도하게 사용하면 성능이 저하될 수 있습니다. 문이 한 번만 실행되는 경우 직접 실행은 서버로의 네트워크 왕복을 1회만 필요로 합니다. 한 번만 실행되는 SQL 문을 준비하고 실행하면 네트워크 왕복이 추가로 필요합니다. 즉 문을 준비하는 데 한 번, 문을 실행하는 데 한 번이 필요합니다.

매개 변수 표식이 사용되는 경우 문을 준비하는 것이 좀 더 효과적입니다. 예를 들어 응용 프로그램이 종종 AdventureWorks 예제 데이터베이스의 제품 정보 검색 요청을 받는 경우를 생각해 봅시다. 응용 프로그램에서는 두 가지 방법으로 이를 처리할 수 있습니다.

첫째, 응용 프로그램이 요청된 각 제품에 대해 별도의 쿼리를 실행할 수 있습니다.

SELECT * FROM AdventureWorks.Production.Product
WHERE ProductID = 63;

둘째, 응용 프로그램에서 다음을 수행합니다.

  1. 매개 변수 표식(?)을 포함하는 문을 준비합니다.

    SELECT * FROM AdventureWorks.Production.Product
    WHERE ProductID = ?;
    
  2. 프로그램 변수를 매개 변수 표식에 바인딩합니다.

  3. 제품 정보가 필요할 때마다 키 값으로 바인딩된 변수를 채우고 문을 실행합니다.

두 번째 방법은 문이 네 번 이상 실행될 때 좀 더 효율적입니다.

SQL Server에서는 준비/실행 모델이 직접 실행에 비해 성능상의 큰 이점이 없는데 이는 SQL Server에서 실행 계획을 재사용하기 때문입니다. SQL Server에서는 현재 SQL 문을 이전에 실행된 동일한 SQL 문에 대해 생성된 실행 계획과 비교하는 효율적인 알고리즘을 제공합니다. 응용 프로그램이 매개 변수 표식을 사용하여 여러 번 SQL 문을 실행하는 경우 SQL Server에서는 해당 계획이 프로시저 캐시에서 에이징되지 않는 한 두 번째 실행부터는 첫 번째 실행의 실행 계획을 재사용합니다. 준비/실행 모델은 여전히 다음과 같은 이점을 제공합니다.

  • 식별 핸들로 실행 계획을 찾는 것은 SQL 문을 기존 실행 계획과 비교하는 알고리즘보다 더 효율적입니다.

  • 응용 프로그램이 실행 계획이 만들어지고 재사용되는 시기를 제어할 수 있습니다.

  • 준비/실행 모델은 이전 버전의 SQL Server를 비롯한 다른 데이터베이스로 이식 가능합니다.