다음을 통해 공유


명령 준비

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

OLE DB 드라이버 다운로드

OLE DB Driver for SQL Server는 단일 명령의 최적화된 여러 실행을 위한 명령 준비를 지원합니다. 그러나 명령 준비는 오버헤드를 생성하며 소비자는 명령을 두 번 이상 실행하도록 준비할 필요가 없습니다. 일반적으로 명령이 세 번 이상 실행되는 경우 준비해야 합니다.

성능상의 이유로 명령 준비는 명령이 실행될 때까지 지연됩니다. 이 옵션은 기본 동작입니다. 따라서 준비 중인 명령에서 발생하는 모든 오류는 명령이 실행되거나 메타 속성 작업이 수행될 때까지 알려지지 않습니다. SQL Server 속성 SSPROP_DEFERPREPARE FALSE로 설정하면 이 기본 동작이 해제됩니다.

SQL Server에서 명령이 직접 실행되면(먼저 준비하지 않고) 실행 계획이 만들어지고 캐시됩니다. SQL 문이 다시 실행되면 SQL Server에는 새 문을 캐시의 기존 실행 계획과 일치시키는 효율적인 알고리즘이 있으며 해당 문에 대한 실행 계획을 다시 사용합니다.

준비된 명령의 경우 SQL Server는 명령 문을 준비하고 실행하기 위한 기본 지원을 제공합니다. 문을 준비할 때 SQL Server는 실행 계획을 만들고, 캐시하고, 이 실행 계획에 대한 핸들을 공급자에게 반환합니다. 그런 다음 공급자는 이 핸들을 사용하여 문을 반복적으로 실행합니다. 이때 저장 프로시저는 만들어지지 않습니다. 핸들에서는 직접 실행의 경우와 같이 문을 캐시의 실행 계획과 비교하는 대신 SQL 문의 실행 계획을 직접 식별하므로 문을 여러 번 실행할 경우 직접 실행하기보다 문을 준비하는 것이 더 효율적입니다.

SQL Server 2005(9.x)에서는 준비된 문을 사용하여 임시 개체를 만들 수 없으며 임시 테이블과 같은 임시 개체를 만드는 시스템 저장 프로시저를 참조할 수 없습니다. 이러한 프로시저는 직접 실행해야 합니다.

일부 명령은 준비하면 안 됩니다. 예를 들어 저장 프로시저 실행을 지정하거나 SQL Server 저장 프로시저 만들기에 잘못된 텍스트를 포함하는 명령은 준비하면 안 됩니다.

임시 저장 프로시저가 만들어지면 OLE DB Driver for SQL Server는 임시 저장 프로시저를 실행하여 문 자체가 실행된 것처럼 결과를 반환합니다.

임시 저장 프로시저 생성은 SQL Server용 OLE DB 드라이버 -특정 초기화 속성 SSPROP_INIT_USEPROCFORPREP 의해 제어됩니다. 속성 값이 SSPROPVAL_USEPROCFORPREP_ON 또는 SSPROPVAL_USEPROCFORPREP_ON_DROP 경우 OLE DB Driver for SQL Server는 명령이 준비될 때 저장 프로시저를 만들려고 시도합니다. 애플리케이션 사용자에게 충분한 SQL Server 권한이 있는 경우 저장 프로시저를 만드는 데 성공합니다.

드물게 연결을 끊는 소비자의 경우 임시 저장 프로시저를 만들려면 임시 개체가 만들어지는 SQL Server 시스템 데이터베이스인 tempdb상당한 리소스가 필요할 수 있습니다. SSPROP_INIT_USEPROCFORPREP 값이 SSPROPVAL_USEPROCFORPREP_ 경우 명령을 만든 세션이 SQL Server 인스턴스에 대한 연결을 끊을 때만 OLE DB Driver for SQL Server에서 만든 임시 저장 프로시저가 삭제됩니다. 해당 연결이 데이터 원본 초기화 시 만들어진 기본 연결인 경우 임시 저장 프로시저는 데이터 원본 초기화가 취소되는 경우에만 삭제됩니다.

SSPROP_INIT_USEPROCFORPREP 값이 SSPROPVAL_USEPROCFORPREP_ON_DROP이면 SQL Server 용 OLE DB 드라이버 임시 저장 프로시저는 다음과 같은 경우 삭제됩니다.

  • 소비자가 ICommandText::SetCommandText를 사용하여 새 명령을 지정합니다.

  • 소비자는 ICommandPrepare::Unprepare를 사용하여 더 이상 명령 텍스트가 필요하지 않음을 나타냅니다.

  • 소비자가 임시 저장 프로시저를 사용하여 명령 개체에 대한 모든 참조를 해제합니다.

명령 개체는 tempdb에 임시 저장 프로시저를 하나만 포함합니다. 기존 임시 저장 프로시저는 특정 명령 개체의 현재 명령 텍스트를 나타냅니다.

참고 항목

명령