IT/Oracle

GROUP BY를 사용 시 성능과 효율성 향상 방안

IT 블로거 2025. 2. 22. 00:22
300x250

GROUP BY를 사용할 때 성능과 효율성을 높이기 위해 고려할 수 있는 주요 팁과 힌트는 다음과 같습니다

1. 인덱스 사용
  • GROUP BY에서 사용하는 컬럼이 인덱스로 설정되어 있으면 성능이 크게 향상됩니다.
  • 예를 들어, GROUP BY column1을 자주 사용하는 경우 해당 컬럼에 인덱스를 추가합니다:

CREATE INDEX idx_column1 ON table_name (column1);


2. WHERE 조건 추가
  • GROUP BY 전에 데이터를 줄이기 위해 WHERE 조건을 사용하세요. 이렇게 하면 처리할 데이터량을 줄여 성능이 좋아집니다.

SELECT column1, COUNT(*)
FROM table_name
WHERE column2 = 'value'
GROUP BY column1;


3. HAVING 대신 WHERE 사용
  • HAVING은 GROUP BY 이후에 필터링을 적용하므로 더 많은 데이터가 처리됩니다
  • 가능하면 WHERE을 사용해 그룹핑 전에 데이터를 필터링하세요.

-- 비효율적인 방법
SELECT column1, COUNT(*)
FROM table_name
GROUP BY column1
HAVING COUNT(*) > 10;

-- 효율적인 방법
SELECT column1, COUNT(*)
FROM table_name
WHERE column1 IS NOT NULL
GROUP BY column1
HAVING COUNT(*) > 10;


4. 중첩 쿼리 활용
  • 복잡한 그룹핑이 필요한 경우, 중첩 쿼리를 사용하여 데이터를 단계적으로 처리합니다.

SELECT department, AVG(salary)
FROM (
    SELECT department, salary
    FROM employees
    WHERE hire_date > '2020-01-01'
) subquery
GROUP BY department;

 

5. DISTINCT와 GROUP BY 비교
  • GROUP BY는 데이터를 그룹화하고, DISTINCT는 고유한 값을 반환합니다. 일부 경우에는 DISTINCT로 대체할 수 있습니다.

-- GROUP BY
SELECT column1
FROM table_name
GROUP BY column1;

-- DISTINCT
SELECT DISTINCT column1
FROM table_name;

6. ORDER BY와 GROUP BY 최적화
  • GROUP BY와 ORDER BY를 함께 사용할 경우, 동일한 컬럼에 대해 그룹화와 정렬이 동시에 이루어지면 성능이 향상됩니다.

SELECT column1, COUNT(*)
FROM table_name
GROUP BY column1
ORDER BY column1;

7. WITH ROLLUP (MySQL) 또는 GROUPING SETS (Oracle, PostgreSQL)
  • 총합 및 하위 집계를 계산할 때 유용합니다.

-- MySQL WITH ROLLUP
SELECT department, SUM(salary)
FROM employees
GROUP BY department WITH ROLLUP;

-- Oracle/PostgreSQL GROUPING SETS
SELECT department, job_title, SUM(salary)
FROM employees
GROUP BY GROUPING SETS (
    (department, job_title),
    (department),
    ()
);

8. Window Function 활용
  • 그룹화된 데이터 외에도 원본 데이터에 대한 추가 정보가 필요할 경우, GROUP BY 대신 윈도우 함수를 고려하세요.

SELECT employee_id, department, salary,
       AVG(salary) OVER (PARTITION BY department) AS avg_salary
FROM employees;

9. JOIN 후 GROUP BY 최적화
  • JOIN을 사용한 후 GROUP BY를 실행할 때는, 필요하지 않은 컬럼을 제거하거나 JOIN 순서를 조정하여 성능을 개선할 수 있습니다.

SELECT t1.department, COUNT(*)
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
GROUP BY t1.department;

10. 데이터 처리 엔진 이해
  • 사용 중인 데이터베이스의 GROUP BY 최적화 방법을 이해하세요.
  • MySQL : EXPLAIN으로 실행 계획 확인
  • Oracle : HASH GROUP BY로 대규모 데이터 그룹화 최적화
  • PostgreSQL : 작업 중 데이터 정렬 여부 확인

11. 실행 계획(EXPLAIN) 확인
  •상 EXPLAIN 명령어를 사용하여 GROUP BY 쿼리의 실행 계획을 확인하세요:

EXPLAIN SELECT column1, COUNT(*)
FROM table_name
GROUP BY column1;
300x250