ROWNUM = 1 사용이 CURSOR_SHARING 설정에 미치는 영향

Literal SQL을 Bind SQL로 변경하기 위해 CURSOR_SHARING 설정을 변경 하는 경우가 있다.
이때 ROWNUM = 1과 ROWNUM <= 1의 작성 형태에 따라 성능 편차가 발생할 수 있다.

  • CUSOR_SHARING 파라미터 값을 FORCE(또는 SIMILAR)로 변경할 경우,
    (1) ROWNUM = 1 --> ROWNUM = :"SYS_B_O"
  • ROWNUM = :"SYS_B_O"와 같이 상수 처리 부분을 강제로 BIND변수로 변경하는데, 문제는 Optimiser가 상수 처리를 :"SYS_B_O"로 변경한 후
    변수값으로 어떤 값이 입력될 지 알 수 없어, 전체 데이터를 검색한 이후 1건을 추출하는 방식으로 수행되는 것이다.

(2) ROWNUM <= 1 --> ROWNUM <= :"SYS_B_O"

  • 위와 마찬가지로 :"SYS_B_O"값이 어떤 값인지 알 수 없지만, :"SYS_B_O" 값보다 작거나 같은 값이라는 STOPKEY가 정해지기 때문에
    :"SYS_B_O" 변수의 값을 확인하여 작거나 같은 데이터를 추출한다.
    따라서, 전체 데이터를 처리하지 않고, 1건만 추출하고 수행은 종료된다.
결론

1. CURSOR_SHARING 설정을 변경하지 않는다면 결과와 성능은 동일하다.
2. CURSOR_SHARING 설정을 변경하면, ROWNUM = 1 조건의 상수 값 1이 BIND변수로 변경되어 부분범위 처리를 못하는 문제가 발생한다.
3. 습관적으로 ROWNUM <= 1을 작성하자.