쿼리 최적화, Normalization, Execution Plan

moon.kick·2025년 3월 12일

SQL

목록 보기
9/11

참조 : https://developer.mozilla.org/ko/
참조 : 링크드인

쿼리 재작성(Query Rewriting) 및 쿼리 리팩토링(Query Refactoring)과 RDBMS의 주요 구성 요소

1. 쿼리 재작성(Query Rewriting)

쿼리 재작성은 SQL 쿼리의 구조를 변경하여 성능을 향상시키는 기법입니다. 쿼리의 재작성은 쿼리의 결과를 변경하지 않으면서 더 효율적인 형태로 쿼리를 바꾸는 과정을 포함합니다. 이 과정에서 주로 쿼리의 문법이나 연산자를 최적화하여 성능을 개선합니다.

예를 들어, SQL 쿼리에서 서브쿼리를 사용한 경우, 이 서브쿼리를 JOIN으로 변경하는 것만으로도 성능을 크게 향상시킬 수 있습니다. 서브쿼리보다는 조인을 사용하는 것이 일반적으로 더 효율적이기 때문입니다. 또한, 필요 없는 컬럼이나 불필요한 ORDER BY을 제거하는 것도 쿼리 성능을 개선하는 방법 중 하나입니다.

예시:

-- 비효율적인 서브쿼리 예시
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');

-- 쿼리 재작성: 서브쿼리를 JOIN으로 변경
SELECT e.employee_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.location = 'New York';

위의 예시에서, 원래 서브쿼리는 불필요한 중첩을 포함하고 있으며, 이를 JOIN으로 변경함으로써 데이터베이스가 한 번의 실행으로 더 적은 연산을 하도록 할 수 있습니다.

2. 쿼리 리팩토링(Query Refactoring)

쿼리 리팩토링은 쿼리의 구조적 변경을 통해 쿼리 성능을 향상시키는 기법입니다. 쿼리 리팩토링의 목적은 쿼리의 재사용성과 유지 관리 용이성을 높이는 것이며, 이를 통해 데이터베이스와의 상호작용을 최적화할 수 있습니다. 리팩토링은 특히 복잡한 쿼리나 반복되는 쿼리에서 유용하게 사용됩니다.

리팩토링은 여러 가지 방법을 통해 이루어집니다. 예를 들어, 복잡한 쿼리의 분할이나 공통 테이블 표현식(CTE)을 사용하여 쿼리를 더 직관적으로 만드는 방법이 있습니다. 또한, 쿼리의 모듈화를 통해 다양한 쿼리에서 동일한 로직을 반복해서 작성하지 않도록 할 수 있습니다.

예시:

-- 비효율적인 복잡한 쿼리 예시
SELECT employee_name, department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.salary > 5000
AND d.department_name = 'Sales'
AND e.employee_id IN (SELECT employee_id FROM employee_projects WHERE project_id = 1);

-- 쿼리 리팩토링: CTE를 사용하여 쿼리 가독성 향상
WITH ProjectEmployees AS (
  SELECT employee_id
  FROM employee_projects
  WHERE project_id = 1
)
SELECT e.employee_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN ProjectEmployees pe ON e.employee_id = pe.employee_id
WHERE e.salary > 5000
AND d.department_name = 'Sales';

위의 예시에서, CTE(Common Table Expression)를 사용하여 서브쿼리를 외부에서 미리 계산한 후 메인 쿼리에서 사용하는 방식으로 리팩토링하였습니다. 이는 가독성을 높이고, 쿼리 성능을 최적화하는 데 도움을 줍니다.

3. RDBMS의 주요 구성 요소와 쿼리 최적화

RDBMS에서의 쿼리 최적화는 데이터베이스의 구조적인 요소와 밀접하게 연관이 있습니다. 데이터베이스의 구조는 스키마(Schema), 테이블(Table), 열(Column) 등으로 이루어져 있으며, 이 구조가 쿼리 성능에 직접적인 영향을 미칩니다.

  • 스키마(Schema): 데이터베이스의 "구조"를 정의하는 논리적 틀로, 테이블, 관계, 제약 조건 등을 포함합니다. 스키마는 데이터베이스의 무결성을 보장하고, 쿼리가 실행될 때 데이터의 관계와 제약 조건을 통해 효율적인 접근 방식을 결정짓는 중요한 역할을 합니다.
  • 테이블(Table): 데이터는 테이블 형식으로 저장됩니다. 각 테이블은 행(Row)열(Column)로 구성되며, 데이터는 이 구조를 통해 효율적으로 관리됩니다. 쿼리 최적화에서 중요한 것은 필요한 데이터를 정확히 추출하기 위해 인덱스를 적절히 활용하는 것입니다.

4. 쿼리 최적화의 핵심 요소

  • 인덱스 사용: 쿼리에서 자주 사용되는 컬럼에 인덱스를 설정하면 데이터 조회 속도가 현저히 향상됩니다. 특히, JOIN을 사용하거나 조건에 자주 등장하는 컬럼에 인덱스를 적용하면 성능을 크게 개선할 수 있습니다.
  • 정규화(Normalization): 데이터베이스를 정규화하면 데이터 중복을 줄이고 무결성을 높여 쿼리 성능을 개선할 수 있습니다. 정규화된 구조에서는 중복 데이터를 최소화하고, 저장소 효율성을 높여 쿼리 처리 속도를 향상시킬 수 있습니다.
  • 쿼리 계획(Execution Plan): SQL 쿼리가 실행될 때, 데이터베이스는 쿼리 실행 계획을 생성하여 쿼리 성능을 분석합니다. 이 실행 계획을 이해하고 최적화하면, 쿼리의 효율성을 높일 수 있습니다.

5. 정리

쿼리 재작성과 리팩토링은 SQL 쿼리 성능을 최적화하는 중요한 기법입니다. 쿼리 재작성은 쿼리 문법을 최적화하여 성능을 향상시키는 방법이고, 쿼리 리팩토링은 쿼리 구조를 더 효율적이고 유지 관리가 용이하게 만드는 방법입니다. 이러한 기법을 RDBMS의 구조적인 요소인 스키마, 테이블, 과 결합하여 데이터베이스 성능을 최적화할 수 있습니다. 인덱스 사용정규화와 같은 추가적인 기법을 활용하면 더욱 효과적으로 성능을 개선할 수 있습니다.

profile
@mgkick

0개의 댓글