준비된 실행

ODBC API에서는 반복적인 Transact-SQL 문 실행과 관련한 구문 분석 및 컴파일 오버헤드를 줄이는 한 가지 방법으로 준비된 실행을 정의합니다. 응용 프로그램은 SQL 문이 포함된 문자열을 작성한 다음 두 단계로 실행합니다. 먼저 SQLPrepare 함수를 한 번 호출함으로써 데이터베이스 엔진을 사용하여 문을 구문 분석하고 실행 계획으로 컴파일합니다. 그런 다음 필요할 때마다 SQLExecute를 호출하여 준비된 실행 계획을 실행합니다. 이렇게 하면 각각의 실행에서 구문 분석 및 컴파일 오버헤드를 줄일 수 있습니다. 준비된 실행은 응용 프로그램에서 매개 변수가 있는 동일한 SQL 문을 반복적으로 실행하는 데 많이 사용됩니다.

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

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

SQL Server에서는 준비된 실행을 기본으로 지원합니다. 실행 계획이 SQLPrepare에 작성되어 나중에 SQLExecute를 호출할 때 실행됩니다. SQL Server에서는 SQLPrepare에 대한 임시 저장 프로시저를 작성할 필요가 없기 때문에 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를 사용했습니다. 그러나 SQLBindParameter에 반드시 SQLPrepare를 사용할 필요는 없으며 SQLExecDirect와 함께 사용하면 됩니다. 예를 들어 SQLExecDirectSQLBindParameter와 함께 사용하여 한 번만 실행되는 저장 프로시저에서 반환 코드나 출력 매개 변수를 검색합니다. 동일한 문이 여러 번 실행되는 경우가 아니면 SQLPrepareSQLBindParameter와 함께 사용하지 마십시오.

참고 항목

개념

문 실행(ODBC)