준비된 실행

적용 대상: SQL Server Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)

ODBC API는 Transact-SQL 문을 반복적으로 실행하는 것과 관련된 구문 분석 및 컴파일 오버헤드를 줄이기 위한 방법으로 준비된 실행을 정의합니다. 애플리케이션은 SQL 문이 포함된 문자열을 작성한 다음 두 단계로 실행합니다. SQLPrepare 함수를 한 번 호출하여 데이터베이스 엔진에서 문을 구문 분석하고 실행 계획으로 컴파일합니다. 그런 다음 준비된 실행 계획의 각 실행에 대해 SQLExecute 를 호출합니다. 이렇게 하면 각각의 실행에서 구문 분석 및 컴파일 오버헤드를 줄일 수 있습니다. 준비된 실행은 애플리케이션에서 매개 변수가 있는 동일한 SQL 문을 반복적으로 실행하는 데 많이 사용됩니다.

대부분의 데이터베이스에서 준비된 실행은 문을 직접 실행하는 경우보다 3-4배 이상 빠릅니다. 가장 큰 이유는 직접 실행할 경우 매번 문이 컴파일되는 반면에 준비된 실행에서는 문이 한 번만 컴파일되기 때문입니다. 또한 준비된 실행을 사용할 경우 문을 실행할 때마다 드라이버가 전체 SQL 문 대신 실행 계획 식별자와 매개 변수 값만 데이터 원본에 보내면 되므로 네트워크 트래픽도 줄일 수 있습니다.

SQL Server SQLExecDirect에서 실행 계획을 검색하고 재사용하기 위한 향상된 알고리즘을 통해 직접 실행과 준비된 실행 간의 성능 차이를 줄입니다. 따라서 문을 직접 실행할 때도 준비된 실행을 사용할 때와 같이 몇 가지 성능상의 이점을 얻을 수 있습니다. 자세한 내용은 직접 실행을 참조하세요.

또한 SQL Server 준비된 실행에 대한 기본 지원을 제공합니다. 실행 계획은 SQLPrepare 를 기반으로 하며 나중에 SQLExecute 가 호출될 때 실행됩니다. SQLPrepare에서 임시 저장 프로시저를 빌드하는 데 SQL Server 필요하지 않으므로 tempdb의 시스템 테이블에 추가 오버헤드가 없습니다.

성능상의 이유로 SQLExecute 가 호출되거나 메타 속성 작업(예: ODBC의 SQLDescribeCol 또는 SQLDescribeParam )이 수행될 때까지 문 준비가 지연됩니다. 기본 동작입니다. 따라서 준비 중인 문에서 발생하는 모든 오류는 문이 실행되거나 메타 속성 작업이 수행될 때까지 알 수 없습니다. SQL Server Native Client ODBC 드라이버 관련 문 특성 SQL_SOPT_SS_DEFER_PREPARE SQL_DP_OFF 설정하면 이 기본 동작이 해제됩니다.

지연된 준비의 경우 SQLExecute를 호출하기 전에 SQLDescribeCol 또는 SQLDescribeParam을 호출하면 서버에 대한 추가 왕복이 생성됩니다. SQLDescribeCol에서 드라이버는 쿼리에서 WHERE 절을 제거하고 SET FMTONLY ON을 사용하여 서버로 보내 쿼리에서 반환된 첫 번째 결과 집합의 열에 대한 설명을 가져옵니다. SQLDescribeParam에서 드라이버는 서버를 호출하여 쿼리의 매개 변수 표식에서 참조하는 식 또는 열에 대한 설명을 가져옵니다. 이 메서드에는 하위 쿼리의 매개 변수는 확인할 수 없는 등의 몇 가지 제한이 있습니다.

SQL Server Native Client ODBC 드라이버와 함께 SQLPrepare를 과도하게 사용하면 성능이 저하되며, 특히 이전 버전의 SQL Server 연결된 경우 성능이 저하됩니다. 한 번만 실행되는 문에는 준비된 실행을 사용하지 않아야 합니다. 준비된 실행에는 클라이언트에서 서버로의 추가 네트워크 왕복이 필요하므로 문을 한 번만 실행할 때는 준비된 실행이 직접 실행보다 속도가 느립니다. 이전 버전의 SQL Server 임시 저장 프로시저도 생성합니다.

준비된 문은 SQL Server에서 임시 개체를 만드는 데 사용할 수 없습니다.

일부 초기 ODBC 애플리케이션은 SQLBindParameter가 사용될 때마다 SQLPrepare를 사용했습니다. SQLBindParameterSQLPrepare을 사용할 필요가 없으며 SQLExecDirect와 함께 사용할 수 있습니다. 예를 들어 SQLBindParameter와 함께 SQLExecDirect를 사용하여 한 번만 실행되는 저장 프로시저에서 반환 코드 또는 출력 매개 변수를 검색합니다. 동일한 문이 여러 번 실행되지 않는 한 SQLBindParameter와 함께 SQLPrepare를 사용하지 마세요.

참고 항목

문 실행(ODBC)