다음을 통해 공유


ODBC의 동적 SQL 성능

정적 SQL은 많은 상황에서 잘 작동하지만 데이터 액세스를 미리 확인할 수 없는 애플리케이션 클래스가 있습니다. 예를 들어 스프레드시트를 통해 사용자가 쿼리를 입력할 수 있다고 가정합니다. 그러면 스프레드시트가 DBMS로 전송되어 데이터를 검색합니다. 이 쿼리의 내용은 스프레드시트 프로그램을 작성할 때 프로그래머에게 알 수 없습니다.

동적 실행

이 문제를 해결하기 위해 스프레드시트는 동적 SQL이라는 포함된 SQL 형식을 사용합니다. 프로그램에서 하드 코딩된 정적 SQL 문과 달리 동적 SQL 문은 런타임에 빌드되고 문자열 호스트 변수에 배치될 수 있습니다. 그런 다음 처리를 위해 DBMS로 전송됩니다. DBMS는 동적 SQL 문에 대한 런타임에 액세스 계획을 생성해야 하므로 동적 SQL은 일반적으로 정적 SQL보다 느립니다. 동적 SQL 문을 포함하는 프로그램이 컴파일되면 동적 SQL 문은 정적 SQL에서와 같이 프로그램에서 제거되지 않습니다. 대신 DBMS에 문을 전달하는 함수 호출로 대체됩니다. 동일한 프로그램의 정적 SQL 문은 정상적으로 처리됩니다.

동적 SQL 문을 실행하는 가장 간단한 방법은 EXECUTE IMMEDIATE 문을 사용하는 것입니다. 이 문은 컴파일 및 실행을 위해 SQL 문을 DBMS에 전달합니다.

EXECUTE IMMEDIATE 문의 한 가지 단점은 DBMS가 문이 실행될 때마다 SQL 문을 처리하는 5단계를 각각 거쳐야 한다는 것입니다. 이 프로세스와 관련된 오버헤드는 많은 문이 동적으로 실행되는 경우 중요할 수 있으며 해당 문이 비슷한 경우 낭비됩니다.

준비된 실행

위의 상황을 해결하기 위해 동적 SQL은 다음 단계를 사용하는 준비된 실행이라는 최적화된 형식의 실행을 제공합니다.

  1. 이 프로그램은 EXECUTE IMMEDIATE 문과 마찬가지로 버퍼에 SQL 문을 생성합니다. 호스트 변수 대신 물음표(?)를 문 텍스트의 아무 곳이나 상수로 대체하여 상수 값이 나중에 제공될 것임을 나타낼 수 있습니다. 물음표는 매개 변수 표식으로 호출됩니다.

  2. 이 프로그램은 PREPARE 문을 사용하여 SQL 문을 DBMS에 전달합니다. 이 문은 DBMS가 문을 구문 분석, 유효성 검사 및 최적화하고 실행 계획을 생성하도록 요청합니다. 그런 다음, 프로그램에서 EXECUTE 문(EXECUTE IMMEDIATE 문이 아님)을 사용하여 나중에 PREPARE 문을 실행합니다. SQL 데이터 영역 또는 SQLDA라는 특수 데이터 구조를 통해 문에 대한 매개 변수 값을 전달합니다.

  3. 프로그램에서 EXECUTE 문을 반복적으로 사용하여 동적 문이 실행될 때마다 다른 매개 변수 값을 제공할 수 있습니다.

준비된 실행은 여전히 정적 SQL과 동일하지 않습니다. 정적 SQL에서 SQL 문을 처리하는 처음 4단계는 컴파일 시간에 수행됩니다. 준비된 실행에서 이러한 단계는 런타임에 계속 수행되지만 한 번만 수행됩니다. 계획의 실행은 EXECUTE가 호출되는 경우에만 발생합니다. 이 동작은 동적 SQL 아키텍처에 내재된 성능 단점 중 일부를 제거하는 데 도움이 됩니다.

참고 항목

EXECUTE(Transact-SQL)
sp_executesql(Transact-SQL)