다음을 통해 공유


준비된 실행

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

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

대부분의 데이터베이스에서 준비된 실행은 주로 문이 한 번만 컴파일되고 실행될 때마다 직접 실행되는 문이 컴파일되기 때문에 3~4회 이상 실행되는 문에 대한 직접 실행보다 빠릅니다. 준비된 실행은 드라이버가 명령문이 실행될 때마다 전체 SQL 문이 아닌 실행 계획 식별자 및 매개 변수 값을 데이터 원본에 보낼 수 있기 때문에 네트워크 트래픽을 감소할 수 있습니다.

SQL Server는 SQLExecDirect에서 실행 계획을 검색하고 재사용하기 위한 향상된 알고리즘을 통해 직접 실행과 준비된 실행 간의 성능 차이를 줄입니다. 이렇게 하면 준비된 실행의 성능 이점 중 일부를 직접 실행된 문에서 사용할 수 있습니다. 자세한 내용은 직접 실행을 참조하세요.

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

성능상의 이유로 SQLExecute가 호출되거나 메타 속성 작업(예: ODBC의 SQLDescribeParam 또는 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와 함께 사용할 수 있습니다. 예를 들어 SQLBindParameter와 함께 SQLExecDirect를 사용하여 한 번만 실행되는 저장 프로시저에서 반환 코드 또는 출력 매개 변수를 검색합니다. 동일한 문이 여러 번 실행되지 않는 한 SQLBindParameter와 함께 SQLPrepare를 사용하지 마세요.

참고 항목

문 실행(ODBC)