AS/400 수치형의 경우 SQL로 기준을 지정할 때 고려 사항

2992 단어 AS400
※ 개인 메모에서 온 기고, 일반화된 캡처는 준비되지 않았습니다.미안합니다.

■ 결론부터


결론적으로 말하면 안전 대책으로
○ select * from AAA.BBB where slipno = '1705';
이렇게 수치라도 문자형으로 지정하면 번거로움을 피할 수 있다.

■ 설명


● 문제 발생 사례


BBB의 물리적 파일에서 "slipno"이외의 키
BBBZ는 "slipno"가 중요한 논리 파일입니다.
《slipno》는 수치형의numberic이다.
× select * from AAA.BBB where slipno = 1705;
○ select * from AAA.BBBZ where slipno = 1705;
○ select * from AAA.BBB where slipno = '1705';
○ select * from AAA.BBBZ where slipno = '1705';
1000만 건이 넘는 데이터 환경에서
○0.1초 이하
×180초 초과
에 대한 처리 시간이 소요되었습니다.

● 문제가 발생한 이유

  • AS400 내 RPG에 사용되는 수치 유형은 NUMERIC이고, SQL 조회의 수치 유형은 INTEGER로 데이터 유형이 다르다
  • 기본적으로 INTEGER 측은 NUMERIC보다 정밀도가 높기 때문에 대조 기준으로 우선한다
    □ INTER 우선
    □모든 줄에cast가 있음. 물론 색인도 사용하지 않음
  • 논리 파일을 직접 지정한 경우 (키에 관해) 대조할 때의 유형 우선 논리 파일 측면(인덱스를 이용한다는 명확한 뜻이 있기 때문)
    · (논리 파일 측면의 유형) NUMERIC 우선
  • ● 검증


    1) ○ select * from AAA.BBB where slipno = cast(1705 as numeric);
    2) × select * from AAA.BBB where slipno = cast(1705 as integer);
    3) × select * from AAA.BBB where slipno = 1705;
    4) ○ select * from AAA.BBB where slipno = '1705';
    5) ○ select * from AAA.BBBZ where slipno = cast(1705 as numeric);
    6) ○ select * from AAA.BBBZ where slipno = cast(1705 as integer);
    7) ○ select * from AAA.BBBZ where slipno = 1705;
    8) ○ select * from AAA.BBBZ where slipno = '1705';
    ※ 이러한 작업을 수행한 후 Visual Explain을 통해 사용한 색인 이름을 확인했습니다.
    ※ 사내 환경에서 검증한 결과 게재하지 못했습니다.
    1) ○ select * from AAA.BBB where slipno = cast(1705 as numeric);
    NUMERIC에 명시적으로 할당할 때는 유형이 같기 때문에 속도가 빨라집니다.
    색인도 자동으로 BBZ를 사용합니다.
    4) ○ select * from AAA.BBB where slipno = '1705';
    문자열 유형의 경우 NUMERIC가 우선이기 때문에 "1705"가 내부에 캐스트됨(1705 as numberic)
    마찬가지로 BBZ를 사용하여 색인을 빠르게 처리합니다.
    3) × select * from AAA.BBB where slipno = 1705;
    INTEGER 우선 순위가 높음
    NUMERIC 측면(slipno)을 할당하므로 색인(색인)을 사용하지 않고 매우 저속으로 변경됩니다.
    7) ○ select * from AAA.BBBZ where slipno = 1705;
    단, 예외적으로 BBZ를 명시적으로 지정할 경우
    인덱스 형식 우선, 1705 내부 캐스트
    인덱스는 빠른 처리에 사용된다.
    99) ○ select * from AAA.BBBY where slipno = '1705';
    또 흥미로운 것은 부적절한 논리 파일 이름을 지정했어도 (BBBY)
    optimina는 적합한 색인을 사용하기 위해 BBBZ를 자동으로 이용해 처리한다.(이거 대박이다!)
    물론 고속으로 처리할게요.

    ● 요약


    한 마디로 하면 정확한 논리 파일을 지정한 상황에서 SQL문에서 수치 지정(즉 INTEGER)도 문제가 없지만 논리 파일 이름을 잘못 알고 단순히 물리 파일 이름을 지정한 경우 인덱스가 적용되지 않아 표 스캔과 분배 처리에서 매우 무거운 처리가 된다.
    SQL 문에서 문자열로 지정된 경우 NUMERIC 유형이 우선하므로 문자열은 한 번만 NUMERIC 유형에 지정됩니다.또한 이 경우 어떤 논리 파일, 물리 파일을 지정하든지 간에 자동으로 적당한 인덱스를 판정하고 이용한다.
    대체로 캐스트(1705 as numberic)처럼 역할을 할당해도 되지만, 어떤 수치형인지 사전에 조사해야 하기 때문에 쓰기가 번거롭기 때문에 문자열형으로 지정하는 방법이 매우 편리하다.

    부기


    Visual Explain에서는 논리 파일 이름이 사용되는 색인 이름으로 표시됩니다.

    좋은 웹페이지 즐겨찾기