개발 블로그

[Database] DB 조회 쿼리 최적화 본문

데이터/데이터베이스

[Database] DB 조회 쿼리 최적화

갹둥 2024. 6. 26. 17:48

DB 관련 업무는 항상 신중하게...🤔 특히 운영 데이터는 더더욱!!

거창하게는 아니지만 열심히 자료 찾아보면서

SQL 쿼리 튜닝 방법을 간단하게 정리를 해보았습니다...

조만간 책 사서 깊은 공부를 할 예정입니다...

 

Query 최적화

  • 대용량 데이터를 다룰 때 SQL 쿼리 성능을 최적화하는 것이 중요함
  • 성능을 향상하고 응답 시간을 단축시키기 위해

 

1. 필요한 컬럼만 조회

SELECT * FROM employee; //모든 컬럼을 조회하는 것은 비효율적임

SELECT name, age FROM employee;

 

 

2. 적절한 인덱스 사용

💡
인덱스(Index)란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조 (자세한 설명은 생략하겠습니다)
  • 인덱스를 사용하여 검색 범위를 좁힐 수 있음
  • 자주 조회되는 컬럼이나 조인에 사용되는 컬럼에 인덱스를 생성.
  • 특히, WHERE, JOIN, ORDER BY, GROUP BY 절에 사용되는 컬럼에 인덱스를 생성하면 성능이 향상될 수 있음
SELECT name FROM employee WHERE age = 20; 

 

 

3. 와일드카드(%)는 문자열 뒤에 사용하기

  • 상황마다 다르겠지만 Like 조건절에서 와일드카드는 문자열 뒤에사용해야 인덱스를 잘 활용할 수 있음
  • %문자열로 사용하면 Full Table Scan 발생 → 성능 저하
  • 저는 실제로 이거 수정하니깐 성능 좀 개선됨
SELECT name FROM employee WHERE name LIKE '김%';

 

 

 

4. GROUP BY 문에 조건절 사용 시 가능하다면 HAVING 대신 WHERE절 사용

💡
SELECT문 수행 순서

FROM - ON - JOIN - WHERE - GROUP BY - CUBE | ROLLUP - HAVING - SELECT - DISTINCT - ORDER BY - TOP
  • 쿼리 수행 순서가 WHERE이 더 빠르기 때문에 GROUP BY 전에 범위를 줄일 수 있음
SELECT COUNT(name)
FROM employee 
GROUP BY age 
HAVING age > 10;
SELECT COUNT(name)
FROM employee 
GROUP BY age 
WHERE age > 10;

 

 

 

5. 가급적이면 조건문에 기존 컬럼에 대한 계산 수행 사용하지 말기

  • 대부분의 데이터베이스 인덱스는 컬럼의 원래 값에 대해 만들어짐
  • 따라서 WHERE 절에서 컬럼에 연산이나 함수를 적용하면 인덱스를 사용할 수 없게 되어, Full Table Scan이 발생할 수 있음
SELECT * FROM employees WHERE salary * 1.1 > 50000;
  • 최대한 컬럼에는 연산을 사용하지 않도록 해야함. 새로운 컬럼을 추가하는 것도 하나의 방법임(사바사니 충분히 고려해보고 만드세요)

 

 

6. 서브쿼리 대신 조인 사용

  • 서브쿼리를 사용하면 성능이 떨어질 수 있음. 대체 가능하면 조인을 사용하는 것이 좋음
-- 서브쿼리 사용
SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'NY');

-- 조인으로 변경
SELECT e.* FROM employees e JOIN departments d ON e.department_id = d.id WHERE d.location = 'NY';

 

 

 

7. 테이블 구조 최적화

  • 정규화와 비정규화: 데이터 모델링 시 정규화는 데이터 중복을 줄이고 무결성을 유지하는 데 도움이 되지만, 과도한 정규화는 조인이 많아져 성능에 악영향을 미칠 수 있음, 필요한 경우 비정규화를 통해 성능을 개선할 수 있음
  • 파티셔닝: 큰 테이블을 파티셔닝하여 성능을 향상시킬 수 있음, 파티셔닝을 통해 데이터 조회 시 불필요한 파티션을 스캔하지 않도록 할 수 있음