명령문 집중기

명령문 집중기는 유사한 SQL문이 액세스 플랜을 공유하여 성능을 개선할 수 있도록 데이터베이스 서버에서 동적 SQL문을 수정합니다. Db2® 버전 11.5.4 이상에서는 Db2 문장 집중을 위한 두 가지 다른 메커니즘을 제공합니다.

  1. 온라인 트랜잭션 처리(OLTP)에서는, 단순 명령문이 다른 리터럴 값을 사용하여 반복적으로 생성될 수도 있습니다. 이러한 워크로드에서 명령문 재컴파일 비용이 상당한 메모리 사용을 추가할 수 있습니다. 명령문 집중기는 리터럴 값에 상관없이 컴파일된 명령문이 재사용될 수 있도록 하여 이 메모리 사용을 예방합니다. OLTP 워크로드에 대해 수신 SQL문 수정과 연관된 메모리 사용량은 패키지 캐시의 명령문을 재사용하여 실현되는 저장에 비해 명령문 집중기에 대해 작습니다.

    명령문 집중기는 기본적으로 사용되지 않습니다. stmt_conc 데이터베이스 구성 매개변수를 LITERALS로 설정하여 데이터베이스의 모든 동적문에 대해 이를 사용으로 설정할 수 있습니다.

    명령문 집중의 결과로 동적문이 수정되는 경우, 원래 명령문과 수정된 명령문이 둘 다 Explain 출력에 표시됩니다. 이벤트 모니터 논리적 모니터 요소와 MON_GET_ACTIVITY_DETAILS 테이블 함수의 출력은 명령문 집중기가 원래 명령문 텍스트를 수정한 경우 원래 명령문을 표시합니다. 다른 모니터링 인터페이스는 수정된 명령문 텍스트만 표시합니다.

    stmt_conc 데이터베이스 구성 매개변수가 LITERALS로 설정되고 다음 두 개의 명령문이 발행되는 다음 예를 고려하십시오.
       select firstnme, lastname from employee where empno='000020'
       select firstnme, lastname from employee where empno='000070'
    이 명령문은 패키지 캐시에서 항목을 공유하며 해당 항목은 다음 명령문을 사용합니다.
       select firstnme, lastname from employee where empno=:L0
    데이터 서버는 원래 명령문에 사용된 리터럴에 따라 :L0의 값('000020' 또는 '000070')을 제공합니다.

    명령문 집중기를 사용하면 VARCHAR 및 VARGRAPHIC 문자열 리터럴의 길이 속성이 문자열 리터럴의 길이보다 커야 합니다.

    명령문 집중기는 일부 내장 함수가 서로 다른 결과 유형을 리턴하도록 할 수 있습니다. 예를 들어, 명령문 집중기가 사용되면 REPLACE가 다른 유형을 리턴할 수 있습니다. WORKDEPT 컬럼은 CHAR(3)로 정의되며, 명령문 집중기가 사용 안함으로 설정될 때 다음 쿼리는 VARCHAR(3)를 리턴합니다.
     SELECT REPLACE(WORKDEPT,'E2','E9') FROM EMPLOYEE

    stmt_conc= LITERALS인 경우 두 문자열 리터럴은 매개변수 마커로 대체되고 리턴 유형은 VARCHAR(6)입니다.

    명령문 집중은 명령문 텍스트를 변경하므로, 명령문 집중기는 액세스 플랜 선택에 영향을 미칩니다. 명령문 집중기는 패키지 캐시의 유사한 명령문에 유사한 플랜이 있는 경우에 가장 잘 작동합니다. 명령문의 리터럴 값이 달라서 액세스 플랜이 다르거나 리터럴의 값으로 플랜 선택사항 및 실행 시간에서 큰 차이가 생기면(예를 들어, 리터럴이 나타나면 표현식이 표현식 기반 인덱스 키와 일치할 수 있음) 해당 명령문의 명령문 집중기를 사용하지 마십시오.

  2. 일부 애플리케이션은 "--"로 시작하는 명령문 주석(단순 SQL 주석)을 추가합니다. 이러한 주석은 명령문 컴파일과도 관계없고 생성된 액세스 플랜과도 관계가 없습니다. 이는 단지 소스 애플리케이션 서버 또는 기타 어카운팅 정보를 표시할 수 있습니다. 이러한 명령문이 동적 SQL 패키지 캐시에서 처리되는 경우, 완벽하게 동일하지만 명령문 끝에 다른 주석이 추가된 명령문은 기본적으로 패키지 캐시에서 다른 명령문으로 처리됩니다. 패키지 캐시에 이러한 중복된 항목이 있으면 패키지 캐시의 용량 및 적중 비율이 감소될 수 있고 이로 인해 기능적으로 동일한 명령문에 대해 추가적인 컴파일 오버헤드가 발생할 수 있습니다.

    stmt_conc 를 COMMENTS로 설정하면, Db2 동적 SQL 캐시에 삽입하기 전에 문장 텍스트에서 이러한 간단한 SQL 주석을 제거합니다. 그러면 주석의 컨텐츠와는 별도로 동일한 모든 명령문이 동적 SQL 패키지 캐시에서 단일 항목을 공유하게 됩니다. 그러면 패키지 캐시에서 공간이 절약되고 불필요한 컴파일을 예방할 수 있습니다. 명령문이 패키지 캐시에 삽입될 때 제거된 스트라이프된 주석은 메모리에 저장되고 모니터링 쿼리(예: MON_GET_PKG_CACHE_STMT)에서 stmt_comments(으)로 사용 가능합니다.

    예를 들어 다음 명령문이
    SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO=?  -- issued from appserver ABC at 2024-11-10-12:05
    SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO=?  -- issued from appserver CDE at 2024-11-09-08:07
    SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO=?  -- issued from appserver QRZ at 2024-11-11-14:12

    stmt_conc을(를) COMMENTS로 설정하면 동적 SQL 캐시에서 단일 항목을 공유합니다.

    stmt_conc을(를) COMM_LIT로 설정하면 'literal' 및 'comment' 집중이 모두 수행됩니다.

    참고: COMMENTSCOMM_LIT 옵션Db2 버전 11.5.4 이상에서 사용할 수 있습니다.