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
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. 테이블 구조 최적화
- 정규화와 비정규화: 데이터 모델링 시 정규화는 데이터 중복을 줄이고 무결성을 유지하는 데 도움이 되지만, 과도한 정규화는 조인이 많아져 성능에 악영향을 미칠 수 있음, 필요한 경우 비정규화를 통해 성능을 개선할 수 있음
- 파티셔닝: 큰 테이블을 파티셔닝하여 성능을 향상시킬 수 있음, 파티셔닝을 통해 데이터 조회 시 불필요한 파티션을 스캔하지 않도록 할 수 있음
'데이터 > 데이터베이스' 카테고리의 다른 글
[Database] MySQL User 생성 (0) | 2024.07.24 |
---|---|
[Database] DB Session & Connection (0) | 2024.07.24 |
[Database] Transaction과 ACID (0) | 2024.07.05 |
[Database] 스토리지 엔진 InnoDB VS MyISAM (0) | 2024.07.04 |
[Database] Oracle 문법 복습/ DDL(CREATE, ALTER, DELETE) (0) | 2024.02.19 |