DB 성능 이슈의 대부분은 쿼리 작성 방식에서 시작된다.
특히 MSSQL 환경에서는 같은 결과를 반환하더라도
쿼리 작성 방법에 따라 성능 차이가 크게 발생한다.
쿼리 성능은 주로 아래 요소에 의해 결정된다.
👉 옵티마이저가 인덱스를 제대로 타게 만드는 것이 핵심이다.
SELECT *
FROM Orders;
SELECT order_id, member_id, price
FROM Orders;
SELECT *
FROM Orders
WHERE YEAR(order_date) = 2024;
SELECT *
FROM Orders
WHERE order_date >= '2024-01-01'
AND order_date < '2025-01-01';
SELECT *
FROM Member
WHERE name LIKE '%kim%';
SELECT *
FROM Member
WHERE name LIKE 'kim%';
JOIN 성능은 ON 조건 컬럼의 인덱스 유무에 크게 좌우된다.
SELECT *
FROM Member m
JOIN Orders o
ON m.member_id = o.member_id;
CREATE INDEX idx_orders_member_id
ON Orders(member_id);
SELECT *
FROM Member m
LEFT JOIN Orders o
ON m.member_id = o.member_id
WHERE o.price >= 10000;
SELECT *
FROM Member m
LEFT JOIN Orders o
ON m.member_id = o.member_id
AND o.price >= 10000;
SELECT DISTINCT m.member_id
FROM Member m
JOIN Orders o
ON m.member_id = o.member_id;
EXISTS 방식 (대량 데이터에서 유리)
SELECT m.member_id
FROM Member m
WHERE EXISTS (
SELECT 1
FROM Orders o
WHERE o.member_id = m.member_id
);
SELECT DISTINCT member_id
FROM Orders;
SELECT *
FROM Member m
WHERE m.member_id IN (
SELECT o.member_id
FROM Orders o
);
SELECT DISTINCT m.*
FROM Member m
JOIN Orders o
ON m.member_id = o.member_id;
또는
SELECT *
FROM Member m
WHERE EXISTS (
SELECT 1
FROM Orders o
WHERE o.member_id = m.member_id
);
SET STATISTICS PROFILE ON;
또는 SSMS에서 실제 실행 계획 보기(Ctrl + M)
CREATE INDEX idx_orders_member_date
ON Orders(member_id, order_date);