문서유형ㅣ장애해결
분야ㅣ관리/환경설정
적용제품버전ㅣTibero 7.2.3. , Tibero 7.2.4
문서번호ㅣTADTS078
현상
운영 서버와 개발 서버에서 같은 테이블, 같은 데이터 환경에서 동일 쿼리 실행 시 결과 값이 다른 현상입니다.
재현 시나리오 및 스크립트
테이블 스크립트
CREATE TABLE COM_CD_test ( GROUP_CD CHAR(5 BYTE) NOT NULL, COM_CD VARCHAR(10 BYTE) NOT NULL, CD_NM VARCHAR(100 BYTE) NULL, EXPLN_CN VARCHAR(1000 BYTE) NULL, UP_CD VARCHAR(10 BYTE) NULL, SORT_NO NUMBER(3) NULL, USE_YN CHAR(1 BYTE) DEFAULT 'Y' NOT NULL, REG_DT TIMESTAMP(6) DEFAULT SYSTIMESTAMP NOT NULL, RGTR_PK VARCHAR(50 BYTE) NOT NULL, MDFCN_DT TIMESTAMP(6) NULL, MDFR_PK VARCHAR(50 BYTE) NULL );
실행된 쿼리
SELECT GROUP_CD, COM_CD, CD_NM, EXPLN_CN , UP_CD, SORT_NO, USE_YN, LEVEL FROM (SELECT GROUP_CD, COM_CD, CD_NM, EXPLN_CN , UP_CD, SORT_NO, USE_YN , CASE WHEN CHK_CNT > 0 THEN UP_CD ELSE NULL END AS COPY_UP_CD FROM (SELECT GROUP_CD, COM_CD, CD_NM, EXPLN_CN , UP_CD, SORT_NO, USE_YN , (SELECT COUNT(*) AS CNT FROM COM_CD_test CCMB WHERE CCMA.GROUP_CD = CCMB.GROUP_CD AND EXISTS (SELECT 1 FROM COM_CD_test CCMC WHERE CCMB.GROUP_CD = CCMC.GROUP_CD AND CCMB.COM_CD = CCMC.UP_CD) ) AS CHK_CNT FROM COM_CD_test CCMA ) A WHERE GROUP_CD = 'LS001' ) A START WITH COPY_UP_CD IS NULL CONNECT BY PRIOR GROUP_CD || '^' || COM_CD = GROUP_CD || '^' || COPY_UP_CD ORDER SIBLINGS BY GROUP_CD, UP_CD, SORT_NO;
결과
운영 서버
개발 서버
운영 서버와 개발 서버 간 데이터 값이 확연히 다른 것이 확인됩니다.
운영 서버의 실행 계획
개발 서버의 실행 계획
실행 계획을 확인한 결과 계획 자체는 동일하나, 코스트 값에 차이가 있음을 확인할 수 있습니다.
원인
개발기와 운영기 간 결과가 차이 나는 현상은 IMS#343668 패치로 인한 결과입니다.
Oracle과의 스펙을 맞추기 위해 PRIOR 연산자의 우선순위가 조정되었으며, 7.2.4에서는 PRIOR 연산 순위가 더 높게 적용되어 아래와 같은 차이가 발생합니다.
- 7.2.3: CONNECT BY PRIOR GROUP_CD || '^' || COM_CD = GROUP_CD || '^' || COPY_UP_CD - 7.2.4: CONNECT BY PRIOR GROUP_CD || '^' || COM_CD = GROUP_CD || '^' || COPY_UP_CD
즉, 각 버전에서 적용되는 스펙이 달라 결과가 다르게 나타나는 것입니다.
해결
구 버전(7.2.3)과 동일한 결과를 원한다면, 아래와 같이 괄호로 묶어 사용함으로써 7.2.4에서도 7.2.3과 동일한 결과가 나오도록 우회할 수 있습니다.
CONNECT BY PRIOR (GROUP_CD || '^' || COM_CD) = GROUP_CD || '^' || COPY_UP_CD ORDER SIBLINGS BY GROUP_CD, UP_CD, SORT_NO;