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