EXPLAIN문
EXPLAIN문은 입력된 Explain 가능한 명령문에서 선택한 액세스 플랜에 관한 정보를 캡처하고 이 정보를 Explain 테이블에 위치시킵니다.
Explain 가능한 명령문은 유효한 XQuery문이 되거나 다음 SQL문 중 하나가 될 수 있습니다. CALL, 복합 SQL(동적), DELETE, INSERT, MERGE, REFRESH, SELECT, SELECT INTO, SET INTEGRITY, UPDATE, VALUES 또는 VALUES INTO
호출
이 명령문은 애플리케이션 프로그램에 임베드되거나 대화식으로 실행될 수 있습니다. 이 명령문은 동적으로 준비할 수 있는 실행문입니다.
Explain될 명령문은 실행되지 않습니다.
권한 부여
명령문의 권한 부여 ID는 다음 권한 중 최소 하나를 보유해야 합니다.- INSERT, UPDATE, DELETE 또는 SELECT문을 허용하는 DATAACCESS 권한입니다.
- Explain 테이블을 포함하는 스키마에 대한 DATAACCESS 권한
- Explain 테이블의 INSERT 권한이며 다음 권한 중 최소 하나를 보유합니다.
- EXPLAIN문에 지정된 Explain 가능한 명령문을 실행하기 위해 필요한 모든 특권(예를 들어, DELETE문이 Explain 가능한 명령문에 사용되는 경우, DELETE문이 Explain되면 DELETE문에 대한 권한 규칙이 적용됨)
- EXPLAIN 권한
- SQLADM 권한
- DBADM 권한
구문
설명
- PLAN SELECTION
- 쿼리 컴파일의 플랜 선택 단계에서 얻은 정보가 Explain 테이블에 삽입됨을 표시합니다.
- 모두
- ALL을 지정하는 것은 PLAN SELECTION을 지정하는 것과 같습니다.
- PLAN
- PLAN 옵션은 다른 시스템의 기존 데이터베이스 애플리케이션에 대한 구문을 허용합니다. PLAN을 지정하는 것은 PLAN SELECTION을 지정하는 것과 같습니다.
- FOR SNAPSHOT
- 이 절은 Explain 스냅샷만 EXPLAIN_STATEMENT 테이블의 SNAPSHOT 컬럼에 옮겨지고 위치할 수 있음을 표시합니다. 다른 Explain 정보는 캡처되며 EXPLAIN_INSTANCE 및 EXPLAIN_STATEMENT 테이블에 존재하지 않습니다.
- WITH SNAPSHOT
- 이 절은 일반 Explain 정보와 더불어, Explain 스냅샷이 수행됨을 표시합니다.
Explain문의 기본 동작은 Explain 스냅샷이 아닌 Explain 정보만 수집하는 것입니다.
기본값(지정된 FOR SNAPSHOT도 WITH SNAPSHOT도 아님) - Explain 테이블에 Explain 정보를 작성하십시오.
- WITH REOPT ONCE
- 이 절은 지정된 explainable statement가 호스트 변수, 매개변수 표시문자, 특수 레지스터의 값 또는 이 명령문을 REOPT ONCE로 다시 최적화하기 위해 이전에 사용됐던 전역 변수를 사용하여 다시 최적화될 것임을 표시합니다. Explain 테이블이 새 액세스 플랜으로 채워집니다. 사용자가 DBADM 권한 또는 데이터베이스 레지스트리 변수 DB2_VIEW_REOPT_VALUES를 YES로 설정한 경우, EXPLAIN_PREDICATE 테이블의 값이 명령문을 다시 최적화하기 위해 사용되면 EXPLAIN_PREDICATE 테이블도 이 값들로 채워집니다.
- SET QUERYNO = 정수
- EXPLAIN_STATEMENT 테이블의 QUERYNO 컬럼으로
integer를 explainable
statement와 연관지으십시오. 입력된 정수값은 양수 값이어야 합니다.
해당 절이 동적 EXPLAIN문에 지정되지 않은 경우, 기본값으로 1이 지정됩니다. 정적 EXPLAIN문의 경우, 지정된 기본값은 프리컴파일러로 지정된 명령문 번호입니다.
- 설정 쿼리 태그 = 문자열-상수
- EXPLAIN_STATEMENT 테이블의 QUERYTAG 컬럼으로
string-constant를 explainable
statement와 연관지으십시오. string-constant는 20 바이트 길이 이하의 문자열이 될 수 있습니다. 입력된 값의 길이가 20 바이트 미만인
경우, 값은 필요한 길이에 대해 우측이 공백으로 패드됩니다.
해당 절이 동적 EXPLAIN문에 지정되지 않은 경우, 기본값으로 공백이 사용됩니다.
- 설명 가능한 SQL 문
- Explain될 SQL문을 지정합니다. 이 명령문은 유효한 CALL, 복합 SQL(동적),
DELETE, INSERT, MERGE, REFRESH, SELECT, SELECT INTO, SET INTEGRITY,
UPDATE, VALUES 또는 VALUES INTO SQL문이 될 수 있습니다. EXPLAIN문이 프로그램에
임베드된 경우, explainable-sql-statement에
호스트 변수에 대한 참조를 포함할 수 있습니다(변수는 프로그램에 정의되어야 함). 마찬가지로, EXPLAIN이 동적으로 준비된 경우,
explainable-sql-statement에 매개변수 표시문자를 포함할 수 있습니다.
explainable-sql-statement는 EXPLAIN문을 독립적으로 준비 및 실행할 수 있는 유효한 SQL문이어야 합니다. 이는 명령문 이름이나 호스트 변수가 될 수 없습니다. CLP를 통해 정의된 커서를 나타내는 SQL문은 이 명령문을 사용하기에 유효하지 않습니다.
동적 SQL을 애플리케이션에서 Explain하려면, 전체 EXPLAIN문을 동적으로 준비해야 합니다.
- XQUERY '설명 가능한 XQuery 문'
- Explain할 XQUERY문을 지정합니다. 이 명령문은 올바른 XQUERY문이 될 수 있습니다.
EXPLAIN문이 프로그램에 임베드된 경우, 'explainable-xquery-statement'에 호스트 변수에 대한 참조를 포함할 수 있으며, 이는 호스트 변수가 맨 위 레벨 XQUERY문에 사용되지 않으나 XMLEXISTS 술어 또는 XMLTABLE 함수에 의한 XMLQUERY 함수를 통해 전달하도록 합니다. 호스트 변수는 프로그램에 정의되어야 합니다.
마찬가지로, EXPLAIN이 동적으로 준비된 경우, 'explainable-xquery-statement'에 매개변수 표시문자를 포함할 수 있으며, 이는 호스트 변수 전달에 대하여 동일한 제한사항이 뒤따르도록 합니다.
또는 Db2® XQUERY 함수 db2-fn:sqlquery 를 사용하여 호스트 변수 및 매개변수 마커에 대한 참조가 포함된 SQL 문을 포함할 수 있습니다.
'explainable-xquery-statement'는 EXPLAIN문을 독립적으로 준비 및 실행할 수 있는 유효한 XQUERY문이어야 합니다. CLP를 통해 정의된 커서를 나타내는 쿼리 명령문은 이 명령문을 사용하기에 유효하지 않습니다.
참고
- 데이터 채우기 중인 Explain 테이블을 규정하는 경우 Explain 기능은 다음 ID를 스키마로 사용합니다.
- 동적 SQL의 세션 권한 부여 ID
- 정적 SQL의 명령문 권한 부여 ID
- 다음 표는 스냅샷 키워드 및 Explain 정보의 상호 작용을 표시합니다.FOR SNAPSHOT도 WITH SNAPSHOT 절도 지정되지 않은 경우, Explain 스냅샷이 수행되지 않습니다.
지정된 키워드 Explain 정보 캡처 없음 예 FOR SNAPSHOT 아니오 WITH SNAPSHOT 예 - Explain 테이블은 EXPLAIN문 호출 전에 사용자에 의하여 작성되어야 합니다. 이 명령문으로 생성한 정보는 명령문이 컴파일된 때 지정된 Explain 테이블, 스키마에 저장됩니다.
- 입력된 explainable statement의 컴파일 중 오류가 발생한 경우에는 Explain 테이블에 정보가 저장되지 않습니다.
- explainable statement로 생성된 액세스 플랜이 저장되지 않았으므로 추후에 호출할 수 없습니다. explainable statement에 대한 Explain 정보는 EXPLAIN문 자체가 컴파일될 때 삽입됩니다.
- EXPLAIN 쿼리 명령문의 경우, 정보는 바인드 시간과 명시적 리바인드 중 Explain 테이블에 삽입됩니다. 프리컴파일 중에는 정적 EXPLAIN문이 수정된 애플리케이션 소스 파일에 주석 처리됩니다. 바인드 시간에는 EXPLAIN문이 SYSCAT.STATEMENTS 카탈로그에 저장됩니다. 패키지가 실행 중인 경우, EXPLAIN문이 실행되지 않습니다. 애플리케이션의 모든 명령문에 대한 섹션 번호는 순차적으로 나열되며 EXPLAIN문을 포함하게 됩니다. 정적 EXPLAIN문 사용을 대체하는 방법은 EXPLAIN 및 EXPLSNAP BIND 또는 PREP 옵션의 조합을 사용하는 것입니다. 정적 EXPLAIN문을 사용하여 Explain 테이블을 여러 개 중 하나의 특정 정적 쿼리 명령문으로 채울 수 있습니다. 간단하게, 대상 명령문을 해당 EXPLAIN문 구문 앞에 붙이고 Explain BIND나 PREP 옵션을 사용하지 않고 애플리케이션을 바인드하십시오. EXPLAIN문은 실제 Explain을 호출할 때 QUERYNO 또는 QUERYTAG 필드를 설정하기에 유리하도록 사용될 수도 있습니다.
- SQL 프로시저의 정적 EXPLAIN문은 프로시저가 컴파일될 때 평가됩니다.
- 증분식 바인드 EXPLAIN 쿼리 명령문의 경우, EXPLAIN문이 컴파일을 위해 제출될 때 Explain 테이블에 데이터가 채워집니다. 패키지가 실행 중인 경우, EXPLAIN문은 처리를 수행하지 않습니다(그래도 명령문은 성공함). Explain 테이블을 채울 때, 채우기 중 사용된 Explain 테이블 규정자 및 권한 부여 ID는 패키지 소유자의 것이 됩니다. EXPLAIN문은 실제 Explain을 호출할 때 QUERYNO 또는 QUERYTAG 필드를 설정하기에 유리하도록 사용될 수도 있습니다.
- 동적 EXPLAIN문의 경우, EXPLAIN문이 컴파일을 위해 제출될 때 Explain 테이블에 데이터가 채워집니다. EXPLAIN문을 PREPARE문으로 준비할 수 있으나 실행하면 처리를 수행하지 않습니다(그래도 명령문은 성공함). 동적 EXPLAIN문 발행을 대체하는 방법은 CURRENT EXPLAIN MODE 및 CURRENT EXPLAIN SNAPSHOT 특수 레지스터의 조합을 사용하여 동적 쿼리 명령문을 Explain하는 것입니다. 실제 EXPLAIN을 호출할 때 QUERYNO 또는 QUERYTAG 필드를 설정하기에 유리한 경우, EXPLAIN문을 사용해야 합니다.
- REOPT 바인드 옵션이 ONCE로 설정되고 CURRENT EXPLAIN MODE 또는 CURRENT EXPLAIN SNAPSHOT 특수 레지스터가 REOPT로 설정된 경우, 호스트 변수, 특수 레지스터, 매개변수 표시문자 또는 전역 변수가 있는 정적 또는 동적 쿼리 명령문을 실행하면 명령문이 다시 최적화된 때에만 Explain 정보가 명령문에 캡처됩니다. 대신, REOPT 바인드 옵션이 ALWAYS로 설정된 경우, Explain 정보는 이 명령문이 실행될 때마다 캡처됩니다.
예:
- 예 1: 단순 SELECT문을 Explain하고
QUERYNO = 13으로 태그를 지정하십시오.
EXPLAIN PLAN SET QUERYNO = 13 FOR SELECT C1 FROM T1 - 예 2: SELECT문을 Explain하고 QUERYTAG = 'TEST13'으로 태그를 지
정하십시오.
EXPLAIN PLAN SELECTION SET QUERYTAG = 'TEST13' FOR SELECT C1 FROM T1 - 예 3: 단순 SELECT문을 Explain하고 QUERYNO = 13 및 QUERYTAG =
'TEST13'으로 태그를 지정하십시오.
EXPLAIN PLAN SELECTION SET QUERYNO = 13 SET QUERYTAG = 'TEST13' FOR SELECT C1 FROM T1 - 예 4: Explain 정보가 존재하지 않는 경우 Explain 정보를 얻도록
시도하십시오.
Explain 테이블이 정의되지 않았으므로 이 명령문은 실패합니다(SQLSTATE 42704).EXPLAIN ALL FOR SELECT C1 FROM T1 - 예 5: 다음 명령문이 패키지 캐시에 있고 REOPT
ONCE를 사용하여 이미 컴파일된 경우 성공합니다.
EXPLAIN ALL WITH REOPT ONCE FOR SELECT C1 FROM T1 WHERE C1 = :<host variable> - 예 6: 다음 예는 db2-fn:xmlcolumn 함수를 사용하며, 이는 XML 컬럼의
대소문자 구분된 이름을 인수로 취하며 XML 컬럼 값의 병합인 XML 시퀀스를 리턴합니다.BUSINESS.CUSTOMER라는 테이블을 INFO라는 XML 컬럼으로 간주하십시오. INFO 컬럼의 모든 문서를 리턴하는 단순 XQuery는 다음과 같습니다.
EXPLAIN PLAN SELECTION FOR XQUERY 'db2-fn:xmlcolumn ("BUSINESS.CUSTOMER.INFO")'컬럼 값이 널이면 해당 행에 대한 결과 리턴 시퀀스는 비어 있게 됩니다.
