오라클 쿼리 성능을 떨어뜨리는 흔한 실수: WHERE절에서 함수 사용

Posted by heoncode
2025. 4. 8. 10:19 오라클 실무 쿼리 튜닝
반응형
SMALL

오라클에서 쿼리 성능을 높이기 위해 인덱스를 적극적으로 활용하는 것이 중요합니다.
하지만 아무 생각 없이 작성한 WHERE절 하나가 인덱스를 무용지물로 만들어버릴 수 있습니다.

대표적인 실수가 바로 컬럼에 함수를 적용하여 인덱스를 타지 못하게 만드는 것입니다.
이 문제는 단순히 성능 저하로 끝나는 것이 아니라, 대용량 테이블에서는 실제 서비스 지연으로 이어질 수 있습니다.


잘못된 예시

SELECT * FROM EMP
WHERE TO_CHAR(HIREDATE, 'YYYY') = '1981';

위 쿼리는 HIREDATE 컬럼에 TO_CHAR 함수를 적용하고 있습니다.
이런 경우, 해당 컬럼에 인덱스가 걸려 있어도 인덱스를 사용할 수 없습니다.
결과적으로 오라클은 전체 테이블을 스캔(Full Table Scan) 하게 되고, 처리 시간이 급격히 늘어날 수 있습니다.


인덱스를 살리는 방법

함수는 리터럴 값(고정값)에 적용하고, 컬럼은 그대로 사용하는 것이 핵심입니다.

SELECT * FROM EMP
WHERE HIREDATE BETWEEN TO_DATE('1981-01-01', 'YYYY-MM-DD')
                  AND TO_DATE('1981-12-31', 'YYYY-MM-DD');

이 방식은 HIREDATE 컬럼에 함수가 적용되지 않기 때문에, 인덱스를 그대로 사용할 수 있습니다.
결과적으로 훨씬 빠른 조회 성능을 기대할 수 있죠.


실무에서 자주 발생하는 유사 사례

  • UPPER(컬럼) 또는 LOWER(컬럼) 으로 검색할 때
  • TRUNC(날짜컬럼)으로 날짜 비교할 때
  • 숫자 계산이 들어간 컬럼 비교 예: SALARY + BONUS > 5000

이런 경우 모두 인덱스를 못 타게 되어, 쿼리 성능이 나빠질 수 있습니다.
가능하면 계산이나 변환은 리터럴 값 쪽에 적용하도록 쿼리를 재작성하세요.


요약

  • WHERE절에서 컬럼에 함수 적용 시 인덱스를 사용할 수 없음
  • 성능을 위해 컬럼은 그대로 두고 리터럴에만 함수 사용
  • 실무에서는 사소한 실수 하나가 전체 시스템에 영향을 줄 수 있음
  • 습관처럼 인덱스를 고려한 WHERE절을 작성하는 것이 중요!

#오라클성능 #쿼리튜닝 #인덱스활용 #SQL성능최적화 #오라클쿼리 #개발팁

반응형
LIST

오라클 인덱스 스캔 방식 정리 - FULL SCAN, RANGE SCAN, UNIQUE SCAN 차이점

Posted by heoncode
2025. 4. 8. 01:32 오라클 실무 쿼리 튜닝
반응형
SMALL

오라클에서 쿼리의 성능을 결정짓는 중요한 요소 중 하나가 인덱스 사용 방식입니다. 이번 글에서는 실무에서 자주 마주치는 인덱스 스캔 방식 3가지를 정리해봅니다.


✅ 1. INDEX FULL SCAN

  • 전체 인덱스를 처음부터 끝까지 읽는 방식입니다.
  • 조건절의 범위가 넓거나, 정렬이 필요한 경우 사용됩니다.
  • 테이블 액세스 없이 인덱스에서만 데이터를 해결할 수 있는 경우 효율적일 수 있습니다.
  • 사용 예시: WHERE 절이 없고 ORDER BY만 있을 때 등

✅ 2. INDEX RANGE SCAN

  • 가장 일반적으로 사용되는 인덱스 스캔 방식입니다.
  • 조건절에 의해 특정 범위의 인덱스 값을 읽을 때 사용됩니다.
  • 주로 BETWEEN, >, <, IN, LIKE와 같은 조건이 포함될 때 발생합니다.
  • 사용 예시: WHERE age BETWEEN 20 AND 29

✅ 3. INDEX UNIQUE SCAN

  • 인덱스 컬럼이 UNIQUE이고, 조건절이 정확히 하나의 값을 지정할 때 사용됩니다.
  • 항상 최대 하나의 결과만 반환합니다.
  • 성능상 가장 빠른 인덱스 스캔 방식 중 하나입니다.
  • 사용 예시: WHERE id = 123 (id가 유니크한 경우)

🧠 실무 팁

  • 항상 인덱스를 만든다고 좋은 게 아닙니다. 테이블 구조, 조회 조건, 반환 건수 등을 고려해야 합니다.
  • SQL 실행 계획(EXPLAIN PLAN)을 통해 실제 어떤 인덱스 스캔 방식이 사용되는지 확인해보세요.

📌 마무리
인덱스 스캔 방식을 이해하고 있으면, 실행 계획을 해석할 수 있고 쿼리 튜닝 시 효과적으로 방향을 잡을 수 있습니다. 다음 글에서는 "INDEX SKIP SCAN"과 "FAST FULL SCAN" 등 잘 알려지지 않은 스캔 방식도 소개할 예정입니다.

#오라클 #SQL튜닝 #인덱스스캔 #INDEXSCAN #쿼리최적화
#DB성능 #오라클실무 #오라클튜닝 #실무SQL #개발자블로그 #티스토리블로그

반응형
LIST

성능이 확 달라집니다: 오라클 SQL 힌트 실무 적용 가이드

Posted by heoncode
2025. 4. 7. 17:17 오라클 실무 쿼리 튜닝
반응형
SMALL

성능이 확 달라집니다: 오라클 SQL 힌트 실무 적용 가이드

오라클에서 SQL 성능을 조절하고 싶을 때 가장 직접적으로 개입할 수 있는 방법이 힌트(HINT) 입니다.
이번 글에서는 실무에서 자주 쓰는 힌트 종류와 사용법을 예제와 함께 정리해볼게요.


✅ 힌트란?

오라클 옵티마이저는 SQL을 자동으로 최적화하지만,
때로는 개발자가 직접 개입해서 더 나은 실행 계획을 유도할 수 있습니다.

이때 사용하는 것이 바로 힌트(HINT)입니다.
힌트는 주석처럼 보이지만 실제로는 옵티마이저에게 명령을 전달하는 강력한 도구입니다.


✅ 힌트 기본 문법

SELECT /*+ 힌트명 */ 컬럼명 FROM 테이블명;

예시:

SELECT /*+ INDEX(emp emp_name_idx) */ name  
FROM emp  
WHERE name = 'John';

✅ 실무에서 자주 쓰는 힌트 정리

  • FULL(table)
    → 테이블을 무조건 Full Scan 하도록 강제
    SELECT /*+ FULL(emp) */ * FROM emp

  • INDEX(table index_name)
    → 특정 인덱스를 사용하도록 강제
    SELECT /*+ INDEX(emp emp_name_idx) */ name FROM emp WHERE name = 'John'

  • NO_INDEX(table index_name)
    → 특정 인덱스를 사용하지 않도록 강제

  • USE_NL(table)
    → Nested Loop Join을 사용하도록 유도
    SELECT /*+ USE_NL(emp dept) */ ...

  • LEADING(table)
    → 조인 순서를 지정
    SELECT /*+ LEADING(emp dept) */ ...

  • PARALLEL(table, degree)
    → 병렬 처리 적용 (주의: 서버 자원 고려)


🧠 실무 팁

  • 힌트는 남용하면 역효과가 날 수 있습니다.
  • 옵티마이저가 힌트를 무시할 수도 있기 때문에, 실행 계획을 꼭 확인하세요.
  • 힌트는 임시 조치 또는 특정 상황에서 성능을 개선할 때 전략적으로 사용해야 합니다.

📌 마무리

힌트는 고성능 SQL을 작성할 수 있는 강력한 도구입니다.
하지만 제대로 이해하지 않고 사용할 경우 성능 저하를 부를 수도 있습니다.
항상 EXPLAIN PLAN 또는 AUTOTRACE 등을 통해 실행 계획을 확인하세요!

#오라클 #SQL힌트 #쿼리성능 #쿼리튜닝 #오라클실무
#FULLSCAN #INDEX힌트 #실행계획 #오라클튜닝 #개발자블로그 #티스토리블로그

오라클, SQL힌트, 오라클힌트, 쿼리성능, SQL튜닝, 쿼리튜닝, FULLSCAN, INDEX힌트, 실행계획, 오라클튜닝, 힌트적용, 옵티마이저, 오라클실무, 개발자블로그, 티스토리블로그

성능이 확 달라집니다: 오라클 SQL 힌트 실무 적용 가이드

오라클에서 SQL 성능을 조절하고 싶을 때 가장 직접적으로 개입할 수 있는 방법이 힌트(HINT) 입니다.
이번 글에서는 실무에서 자주 쓰는 힌트 종류와 사용법을 예제와 함께 정리해볼게요.


✅ 힌트란?

오라클 옵티마이저는 SQL을 자동으로 최적화하지만,
때로는 개발자가 직접 개입해서 더 나은 실행 계획을 유도할 수 있습니다.

이때 사용하는 것이 바로 힌트(HINT)입니다.
힌트는 주석처럼 보이지만 실제로는 옵티마이저에게 명령을 전달하는 강력한 도구입니다.


✅ 힌트 기본 문법

SELECT /*+ 힌트명 */ 컬럼명 FROM 테이블명;

예시:

SELECT /*+ INDEX(emp emp_name_idx) */ name  
FROM emp  
WHERE name = 'John';

✅ 실무에서 자주 쓰는 힌트 정리

  • FULL(table)
    → 테이블을 무조건 Full Scan 하도록 강제
    SELECT /*+ FULL(emp) */ * FROM emp

  • INDEX(table index_name)
    → 특정 인덱스를 사용하도록 강제
    SELECT /*+ INDEX(emp emp_name_idx) */ name FROM emp WHERE name = 'John'

  • NO_INDEX(table index_name)
    → 특정 인덱스를 사용하지 않도록 강제

  • USE_NL(table)
    → Nested Loop Join을 사용하도록 유도
    SELECT /*+ USE_NL(emp dept) */ ...

  • LEADING(table)
    → 조인 순서를 지정
    SELECT /*+ LEADING(emp dept) */ ...

  • PARALLEL(table, degree)
    → 병렬 처리 적용 (주의: 서버 자원 고려)


🧠 실무 팁

  • 힌트는 남용하면 역효과가 날 수 있습니다.
  • 옵티마이저가 힌트를 무시할 수도 있기 때문에, 실행 계획을 꼭 확인하세요.
  • 힌트는 임시 조치 또는 특정 상황에서 성능을 개선할 때 전략적으로 사용해야 합니다.

📌 마무리

힌트는 고성능 SQL을 작성할 수 있는 강력한 도구입니다.
하지만 제대로 이해하지 않고 사용할 경우 성능 저하를 부를 수도 있습니다.
항상 EXPLAIN PLAN 또는 AUTOTRACE 등을 통해 실행 계획을 확인하세요!

#오라클 #SQL힌트 #쿼리성능 #쿼리튜닝 #오라클실무
#FULLSCAN #INDEX힌트 #실행계획 #오라클튜닝 #개발자블로그 #티스토리블로그

반응형
LIST