전체 글: 60개의 글

NULL은 0이 아니다! SQL에서 NULL이 가진 의미와 주의점

Posted by heoncode
2025. 4. 10. 11:34 SQL 기초 정리
728x90
반응형
SMALL

SQL을 처음 접할 때 가장 혼동하기 쉬운 개념 중 하나가 바로 NULL입니다. 많은 분들이 NULL을 숫자 0이나 빈 문자열로 오해하지만, 실제로는 값이 존재하지 않음을 의미합니다.

NULL은 어떤 의미인가요?

  • NULL값이 존재하지 않음을 나타냅니다.
  • 숫자 0(0)은 실제 값이고, NULL값 자체가 없음입니다.
  • 빈 문자열('')도 NULL과 다릅니다. 빈 문자열은 값이지만, 비어있는 값일 뿐입니다.

NULL을 비교할 때 주의할 점

일반적인 비교 연산자(=, !=)로는 NULL 값을 정확히 비교할 수 없습니다. 예를 들어 다음 쿼리는 아무 결과도 반환하지 않습니다.

SELECT * FROM employees WHERE commission_pct = NULL;

이유는 NULL = NULL은 참이 아니라 알 수 없음(UNKNOWN)이 되기 때문입니다. NULL 비교는 반드시 IS NULL 또는 IS NOT NULL을 사용해야 합니다.

SELECT * FROM employees WHERE commission_pct IS NULL;

집계 함수와 NULL

  • COUNT(*)는 모든 행을 세지만
    COUNT(column)은 해당 컬럼이 NULL이 아닌 값만 셉니다.
  • SUM, AVG, MAX, MIN 같은 집계 함수도 NULL은 무시하고 계산합니다.

실무에서 자주 발생하는 실수

  • 조건절에 = NULL 사용 → 항상 결과가 없음
  • 조인 시 NULL값이 있는 컬럼 누락 → 원하는 결과 누락
  • 정렬(SORT) 결과가 예상과 다름 → NULLS FIRST 또는 NULLS LAST 명시 필요

SQL에서 NULL은 단순한 "빈 값"이 아닌, 존재하지 않는 상태로 간주됩니다. 쿼리 작성 시 NULL의 의미를 정확히 이해하고 조건절이나 집계 함수에서 적절히 처리하는 것이 매우 중요합니다.


#SQL #NULL #값비교 #ISNULL #쿼리실수 #기초정리 #데이터베이스

728x90
반응형
LIST

WHERE 절 조건의 순서가 성능에 영향을 줄까?

Posted by heoncode
2025. 4. 10. 09:10 SQL 기초 정리
728x90
반응형
SMALL

SQL 쿼리를 작성할 때 WHERE 절 안의 조건 순서를 신경 써야 할까요? 예를 들어 다음 두 쿼리는 조건 순서만 다를 뿐 동일한 결과를 반환합니다.

SELECT * FROM employees
WHERE salary > 5000 AND department_id = 10;

SELECT * FROM employees
WHERE department_id = 10 AND salary > 5000;

논리적으로는 동일하지만, 실행 성능은 달라질 수 있습니다. 그 이유는 바로 오라클 옵티마이저(Optimizer)가 실행 계획을 생성할 때 조건 순서를 고려하기 때문입니다.

옵티마이저는 어떻게 조건을 처리할까?

오라클 옵티마이저는 통계 정보, 인덱스 유무, 조건의 선택도 등을 종합적으로 판단해 실행 계획을 수립합니다. 이 과정에서 조건의 순서가 힌트를 줄 수는 있지만, 옵티마이저는 일반적으로 가장 효율적인 조건부터 우선 적용하려 합니다.

즉, 작성 순서보다는 조건의 필터링 효과(선택도)가 중요합니다. 예를 들어 department_id = 10 조건이 훨씬 더 많은 행을 걸러낼 수 있다면, 옵티마이저는 해당 조건을 먼저 적용하는 방향으로 실행 계획을 구성합니다.

실무에서는 어떤 기준으로 정리할까?

  • 조건 순서는 성능에 직접적인 영향을 주지 않을 수 있음
    → 옵티마이저가 최적 조건을 자동으로 판단

  • 다만 인덱스를 활용하려면 조건 순서가 중요할 수 있음
    → 복합 인덱스의 컬럼 순서에 맞춰 WHERE 조건을 작성하는 것이 유리

  • 실행계획(EXPLAIN PLAN)으로 실제 적용된 조건 순서를 확인
    → 예상과 다른 경우 힌트나 인덱스 조정 필요

조건 순서가 항상 성능을 좌우하는 것은 아니지만, 인덱스 구조와 선택도에 맞춰 조건을 구성하면 더 효율적인 쿼리를 만들 수 있습니다.


#SQL #WHERE절 #조건순서 #실행계획 #성능최적화 #쿼리튜닝 #인덱스활용

728x90
반응형
LIST

INNER JOIN과 OUTER JOIN, 뭐가 다를까? 실무에서 꼭 알아야 할 차이점

Posted by heoncode
2025. 4. 10. 00:57 SQL 기초 정리
728x90
반응형
SMALL

INNER JOIN과 OUTER JOIN, 뭐가 다를까? 실무에서 꼭 알아야 할 차이점

SQL에서 여러 테이블의 데이터를 함께 조회할 때 JOIN을 사용합니다. 하지만 JOIN에는 여러 종류가 있어서 처음 접하는 분들은 헷갈리기 쉽습니다. 특히 INNER JOINOUTER JOIN의 차이를 정확히 이해하는 것은 실무에서 매우 중요합니다. 이번 글에서는 이 두 JOIN의 차이점과 사용 예시를 통해 개념을 확실히 잡아보겠습니다.

1. INNER JOIN – 교집합 찾기

INNER JOIN은 두 테이블에서 공통된 값이 있는 행만 반환합니다. 즉, 양쪽 테이블에 모두 존재하는 데이터만 조회하고, 한쪽에만 있는 데이터는 제외됩니다.

예제:

employees 테이블과 departments 테이블이 있다고 가정해봅시다.

  • employees 테이블:

    employee_id name department_id
    1 철수 10
    2 영희 20
    3 민수 30
  • departments 테이블:

    department_id department_name
    10 인사부
    20 개발부
    40 마케팅부

이제 두 테이블을 department_id를 기준으로 INNER JOIN 해보겠습니다.

SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

결과:

| name  | department_name |
|-------|-----------------|
| 철수  | 인사부          |
| 영희  | 개발부          |

여기서 민수마케팅부는 각각 다른 테이블에만 존재하므로 결과에서 제외되었습니다.

2. OUTER JOIN – 전체 데이터 조회하기

OUTER JOIN은 한쪽 테이블에만 존재하는 데이터도 포함하여 조회합니다. OUTER JOIN은 다시 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN으로 나뉩니다.

  • LEFT OUTER JOIN: 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
  • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
  • FULL OUTER JOIN: 양쪽 테이블의 모든 행을 반환하며, 일치하는 데이터가 없으면 NULL을 반환합니다.

예제:

위의 employeesdepartments 테이블을 LEFT OUTER JOIN 해보겠습니다.

SELECT e.name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id;

결과:

| name  | department_name |
|-------|-----------------|
| 철수  | 인사부          |
| 영희  | 개발부          |
| 민수  | NULL            |

민수employees 테이블에는 있지만 departments 테이블에 해당 department_id가 없으므로 department_name이 NULL로 표시됩니다.

✅ 마무리

  • INNER JOIN: 양쪽 테이블에 모두 존재하는 데이터만 조회
  • OUTER JOIN:
    • LEFT OUTER JOIN: 왼쪽 테이블의 모든 데이터와 일치하는 오른쪽 테이블의 데이터 조회
    • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 데이터와 일치하는 왼쪽 테이블의 데이터 조회
    • FULL OUTER JOIN: 양쪽 테이블의 모든 데이터 조회

JOIN을 적절히 사용하면 데이터베이스에서 원하는 정보를 효율적으로 추출할 수 있습니다. 실무에서는 데이터의 특성과 요구사항에 맞게 JOIN을 선택하여 사용해야 합니다.

#SQL #JOIN #INNERJOIN #OUTERJOIN #데이터베이스 #기초문법 #실무팁

728x90
반응형
LIST

GROUP BY와 ORDER BY의 차이는 뭘까? 비슷해 보이지만 전혀 다른 역할

Posted by heoncode
2025. 4. 9. 17:13 SQL 기초 정리
728x90
반응형
SMALL

GROUP BYORDER BY의 차이는 뭘까? 비슷해 보이지만 전혀 다른 역할

SQL을 처음 배우면 자주 혼동되는 개념 중 하나가 GROUP BYORDER BY입니다. 둘 다 SELECT문에서 자주 사용되며 컬럼 이름을 기준으로 뭔가를 "묶거나 정렬"하는 것 같지만, 실제로는 그 목적과 동작 방식이 완전히 다릅니다. 이번 글에서는 이 두 구문의 차이를 예제와 함께 명확히 정리해 보겠습니다.

1. GROUP BY – 같은 값을 하나의 그룹으로 묶기

GROUP BY는 집계 함수(COUNT, SUM, AVG 등)와 함께 사용되어 같은 값을 가진 행들을 하나의 그룹으로 묶습니다. 예를 들어, 부서별 사원 수를 구하고자 할 때 사용됩니다.

SELECT department_id, COUNT(*) 
FROM employees 
GROUP BY department_id;

위 쿼리는 department_id가 같은 행들을 묶어 각 부서에 몇 명이 있는지 알려줍니다.

✅ 핵심: GROUP BY묶기 (집계 대상 그룹 생성)

2. ORDER BY – 결과를 원하는 순서로 정렬

ORDER BY는 쿼리 결과의 행 순서를 정렬합니다. 오름차순(ASC) 또는 내림차순(DESC)으로 정렬할 수 있으며, 집계와는 아무런 관련이 없습니다.

SELECT employee_id, salary 
FROM employees 
ORDER BY salary DESC;

위 쿼리는 월급이 높은 순으로 직원을 나열하며, 어떤 그룹화도 하지 않습니다.

✅ 핵심: ORDER BY정렬 (출력 순서 제어)

3. 둘을 함께 사용하는 예

GROUP BY로 먼저 그룹을 만든 후, 그 결과를 ORDER BY로 정렬할 수도 있습니다.

SELECT department_id, AVG(salary) AS avg_salary 
FROM employees 
GROUP BY department_id 
ORDER BY avg_salary DESC;

이 쿼리는 부서별 평균 급여를 계산한 뒤, 평균이 높은 부서부터 나열합니다.

✅ 마무리

  • GROUP BY: 집계를 위해 데이터를 묶는 역할
  • ORDER BY: 결과를 정렬하는 역할

두 구문은 비슷해 보이지만 완전히 다른 용도입니다. 실무에서는 이 둘을 함께 사용하는 경우도 많기 때문에 그 차이를 정확히 이해하는 것이 중요합니다.

#SQL #GROUPBY #ORDERBY #정렬 #집계 #SELECT문 #기초문법 #실무팁

728x90
반응형
LIST

INDEX RANGE SCAN과 FULL SCAN, 언제 어떤 게 빠를까?

Posted by heoncode
2025. 4. 9. 09:14 오라클 실무 쿼리 튜닝
728x90
반응형
SMALL

INDEX RANGE SCAN과 FULL SCAN, 언제 어떤 게 빠를까?

오라클의 실행계획에서 자주 등장하는 INDEX RANGE SCAN과 FULL TABLE SCAN은 단순히 “인덱스가 빠르다”는 기준으로 선택할 수 없습니다. 데이터 양, 인덱스 구조, 조건절 등에 따라 성능 차이는 극적으로 달라질 수 있으며, 실무에서는 오히려 FULL SCAN이 더 나은 선택일 때도 있습니다. 이번 글에서는 두 방식의 차이와 선택 기준을 살펴보겠습니다.

1. INDEX RANGE SCAN – 인덱스를 이용한 범위 검색

INDEX RANGE SCAN은 주어진 조건절에 따라 인덱스에서 일부 구간만을 읽어오는 방식입니다. 흔히 사용하는 비교 연산자(=, >, <, BETWEEN, LIKE 'abc%')가 있을 때 주로 사용되며, 조건이 인덱스 컬럼에 명확하게 매핑되어 있어야 효과적입니다.

SELECT * FROM employees WHERE department_id BETWEEN 10 AND 20;

이 경우 인덱스가 department_id에 존재하면 해당 범위만 스캔하게 되어 I/O 비용이 적고 빠른 성능을 기대할 수 있습니다.

2. FULL TABLE SCAN – 조건 무시, 테이블 전체 스캔

FULL SCAN은 인덱스를 무시하고 테이블 전체를 차례로 읽는 방식입니다. 일반적으로는 느릴 것이라 생각하지만, 다음과 같은 경우에는 오히려 효율적일 수 있습니다:

  • 조건절이 대부분의 데이터를 포함하는 경우 (예: 전체의 80% 이상)
  • 인덱스가 없는 경우
  • 병렬 처리를 통해 전체 스캔이 더 빠른 경우
  • 통계 정보나 옵티마이저 판단에 의해 인덱스 사용이 비효율적이라고 판단될 경우

예를 들어, 다음과 같은 쿼리는 조건절이 너무 광범위해 인덱스보다 FULL SCAN이 더 나을 수 있습니다.

SELECT * FROM orders WHERE order_date < SYSDATE;

3. 옵티마이저의 판단 기준

오라클 옵티마이저는 다음 요소를 기준으로 INDEX RANGE SCAN과 FULL SCAN 중 하나를 선택합니다.

  • 통계 정보: 테이블과 인덱스에 대한 최신 통계 정보
  • 데이터 분포도: 조건절이 얼마나 많은 행을 포함하는지
  • 인덱스 선택도: 인덱스가 얼마나 고유한 값들을 가지고 있는지
  • 병렬 처리 가능 여부

실제 실행계획에서 두 방식이 교체되는 경우는 의외로 많기 때문에, 반드시 EXPLAIN PLAN 또는 AUTOTRACE 등을 통해 실행계획을 확인하는 것이 중요합니다.

✅ 마무리

INDEX RANGE SCAN과 FULL TABLE SCAN은 단순히 "인덱스가 있으니까 인덱스 쓰자"는 기준으로 판단할 수 없습니다. 실무에서는 통계 정보, 데이터 양, 조건절, 병렬 처리 여부 등 다양한 요인을 종합적으로 고려해 어떤 방식이 더 빠를지 판단해야 하며, 이를 위해 실행계획 분석은 필수입니다.

#오라클 #SQL #실행계획 #성능 #인덱스 #실무팁 #쿼리튜닝

728x90
반응형
LIST

DISTINCT는 정말 중복만 제거할까? 사용 시 주의해야 할 3가지 포인트

Posted by heoncode
2025. 4. 8. 19:48 SQL 기초 정리
728x90
반응형
SMALL

DISTINCT는 정말 중복만 제거할까? 사용 시 주의해야 할 3가지 포인트

SQL을 처음 배우거나 실무에서 데이터를 정제할 때 자주 등장하는 키워드 중 하나가 DISTINCT입니다. 보통은 "중복 제거" 용도로만 알고 있지만, 생각보다 주의할 점이 많아 잘못 쓰면 원하는 결과를 얻지 못하거나 오히려 성능이 떨어질 수 있습니다. 이번 글에서는 DISTINCT 사용 시 꼭 알아야 할 3가지 핵심 포인트를 정리해보겠습니다.

1. DISTINCT는 SELECT 절 전체 컬럼 조합의 중복을 제거합니다

많은 초보자들이 실수하는 부분입니다. DISTINCT는 단일 컬럼 기준이 아니라, SELECT 절에 명시된 전체 컬럼 조합이 동일한 경우에만 중복으로 판단합니다.

SELECT DISTINCT name, department FROM employees;

위 쿼리는 이름이 같더라도 부서가 다르면 중복으로 간주하지 않습니다. 따라서 원하는 결과가 아니라면 컬럼 선택을 신중하게 해야 합니다.

2. 정렬 순서를 바꾸면 결과는 같지만 처리 방식은 달라질 수 있습니다

DISTINCT를 사용할 때 정렬 순서는 결과값에 영향을 주진 않지만, 내부적으로 처리되는 방식은 바뀔 수 있습니다. 특히 ORDER BY를 추가하면 SQL 엔진은 정렬 연산을 추가로 수행하기 때문에 성능 차이가 날 수 있습니다.

SELECT DISTINCT department FROM employees ORDER BY department;

이처럼 DISTINCTORDER BY를 함께 사용할 때는 인덱스 활용 여부나 정렬 비용을 고려해야 합니다.

3. DISTINCT는 성능상 이슈를 유발할 수 있습니다

중복 제거는 단순해 보여도 실제로는 많은 비용이 발생할 수 있습니다. 내부적으로는 정렬(SORT) 또는 해시(HASH) 기반의 비교 연산이 일어나며, 데이터 양이 많아질수록 작업량도 크게 증가합니다.

대량의 데이터를 다룰 때는 DISTINCT보다 GROUP BY를 고려하거나, 아예 애초에 데이터가 중복되지 않도록 설계하는 것이 더 효율적일 수 있습니다.

✅ 마무리

DISTINCT는 단순한 기능이지만, 그 동작 원리를 정확히 알고 사용하지 않으면 엉뚱한 결과를 초래하거나 불필요한 성능 저하를 일으킬 수 있습니다. 실무에서는 반드시 컬럼 조합과 데이터 특성을 이해한 뒤에 신중히 사용하는 습관이 필요합니다.

#SQL #DISTINCT #중복제거 #기초문법 #SELECT문 #실무팁 #데이터정제

728x90
반응형
LIST

인덱스가 성능을 좌우한다? 속도 차이가 극명하게 나는 상황 3가지

Posted by heoncode
2025. 4. 8. 16:52 오라클 실무 쿼리 튜닝
728x90
반응형
SMALL

인덱스가 성능을 좌우한다? 속도 차이가 극명하게 나는 상황 3가지

SQL 성능 튜닝에서 인덱스(Index)는 빼놓을 수 없는 핵심 요소입니다. 하지만 단순히 인덱스를 만든다고 해서 항상 쿼리 속도가 빨라지는 것은 아닙니다. 인덱스가 실제로 효과를 발휘하는 조건과, 오히려 비효율을 유발하는 상황까지 모두 고려해야 실무에서 제대로 활용할 수 있습니다.

이번 글에서는 인덱스 유무에 따라 성능 차이가 극명하게 나는 3가지 상황을 실무 관점에서 정리해봅니다.


1. WHERE 절에서 다중 조건 필터링 시

SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID = 10 AND JOB_ID = 'IT_PROG';

만약 DEPARTMENT_ID, JOB_ID 각각 단독 인덱스만 존재하고, 두 컬럼을 동시에 포함한 복합 인덱스가 없다면 옵티마이저는 인덱스를 비효율적으로 사용할 수 있습니다. 반면 (DEPARTMENT_ID, JOB_ID)로 구성된 복합 인덱스를 만들면 효율적인 Index Range Scan이 가능해집니다.

📌 실무 팁: 자주 함께 사용하는 조건은 복합 인덱스로 묶어주는 것이 훨씬 유리합니다.


2. 정렬(ORDER BY) + 페이징 처리 시

SELECT * FROM EMPLOYEES
ORDER BY HIRE_DATE
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

HIRE_DATE 컬럼에 인덱스가 없으면 정렬 작업은 전 테이블을 스캔하면서 정렬 메모리를 소모하게 됩니다. 반면 인덱스가 있으면 인덱스 자체가 이미 정렬된 구조이므로 빠르게 필요한 범위만 추출할 수 있습니다.

📌 실무 팁: 페이징 쿼리에서는 정렬 기준 컬럼에 반드시 인덱스가 있어야 성능 이점을 누릴 수 있습니다.


3. 서브쿼리에서 EXISTS 조건 사용 시

SELECT * FROM DEPARTMENTS D
WHERE EXISTS (
  SELECT 1 FROM EMPLOYEES E
  WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
);

EMPLOYEES.DEPARTMENT_ID에 인덱스가 없다면 EXISTS 서브쿼리마다 테이블을 반복 스캔하게 되어 성능 저하가 큽니다. 반면 해당 컬럼에 인덱스가 있다면 각 부서별 매칭을 빠르게 찾을 수 있어 성능이 크게 개선됩니다.

📌 실무 팁: EXISTS 또는 IN 서브쿼리에서 조인 키에 인덱스가 없으면 심각한 성능 저하가 발생할 수 있습니다.


마무리하며

인덱스는 단순히 만들어두는 것이 아니라, 쿼리 실행 계획을 고려한 설계가 중요합니다. 특히 자주 사용되는 조합, 정렬 조건, 서브쿼리의 조인 키 등을 파악해 전략적으로 인덱스를 설계하는 것이 실무 튜닝의 핵심입니다.

항상 실행 계획(EXPLAIN PLAN)을 확인하고, 인덱스가 실제로 사용되는지 검증하는 습관을 들이세요.

#오라클 #SQL #쿼리튜닝 #인덱스 #성능개선 #실무팁 #데이터베이스

728x90
반응형
LIST

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

Posted by heoncode
2025. 4. 8. 10:19 오라클 실무 쿼리 튜닝
728x90
반응형
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성능최적화 #오라클쿼리 #개발팁

728x90
반응형
LIST

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

Posted by heoncode
2025. 4. 8. 01:32 오라클 실무 쿼리 튜닝
728x90
반응형
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 #개발자블로그 #티스토리블로그

728x90
반응형
LIST

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

Posted by heoncode
2025. 4. 7. 17:17 오라클 실무 쿼리 튜닝
728x90
반응형
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힌트 #실행계획 #오라클튜닝 #개발자블로그 #티스토리블로그

728x90
반응형
LIST