GROUP BY를 사용 시 성능과 효율성 향상 방안
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;