PromleeBlog
sitemap
aboutMe

posting thumbnail
SQL 쿼리 성능 최적화 방안
SQL Query Performance Tuning

📅

🚀

들어가기 전에 🔗

이번 시간에는 느린 애플리케이션의 주범으로 꼽히는, 비효율적인 SQL 쿼리의 성능을 개선하는 방법에 대해 알아보겠습니다.
사용자가 버튼을 눌렀는데 화면이 한참 뒤에 뜨거나, 데이터 보고서가 로딩되는 데 몇 분씩 걸린다면 그 원인은 데이터베이스 쿼리에 있을 가능성이 높습니다.

쿼리 성능 최적화는 단순히 몇 가지 기술을 암기하는 것이 아니라, 데이터베이스가 어떻게 동작하는지 이해하고 문제의 원인을 체계적으로 진단하는 과정에 가깝습니다.
오늘은 그 진단의 첫걸음인 '실행 계획'부터 시작하여, 쿼리를 건강하게 만드는 여러 실용적인 방법들을 함께 탐구해 보겠습니다.

🚀

최적화의 첫걸음: 실행 계획 확인하기 🔗

느린 쿼리를 최적화할 때, 가장 먼저 해야 할 일은
데이터베이스가 그 쿼리를 어떻게 실행하고 있는지
직접 물어보는 것입니다.
이것을 가능하게 해주는 것이 바로
실행 계획(Execution Plan)
입니다.

실행 계획은 데이터베이스 옵티마이저가 특정 쿼리를 수행하기 위해 세운 '작전 계획서'와 같습니다.
마치 내비게이션 앱이 목적지까지 가는 여러 경로(경로 1, 경로 2, 경로 3...)를 분석하고 최적의 경로를 선택하는 것과 유사합니다.

대부분의 SQL 데이터베이스는 EXPLAIN이라는 명령어를 통해 이 실행 계획을 보여줍니다.
느리다고 생각되는 쿼리 앞에 EXPLAIN 키워드를 붙여 실행해 보세요.
EXPLAIN SELECT * FROM users WHERE email = 'student@example.com';
EXPLAIN의 결과는 조금 복잡해 보이지만, 여기서 우리는 몇 가지 핵심 정보를 얻을 수 있습니다.

실행 계획을 먼저 확인하는 습관은, 감에 의존하는 것이 아니라 데이터를 기반으로 문제에 접근하는 좋은 엔지니어의 자세입니다.

🚀

최적화의 핵심 1: 인덱스를 올바르게 활용하기 🔗

지난 시간에 배운 인덱스는 역시 쿼리 최적화의 가장 강력한 도구입니다.
실행 계획을 통해 인덱스를 제대로 사용하지 못하고 있다는 사실을 알았다면, 아래 사항들을 점검해야 합니다.

🚀

최적화의 핵심 2: 불필요한 작업 줄이기 🔗

아무리 인덱스를 잘 사용해도, 쿼리 자체가 불필요한 작업을 많이 하도록 작성되었다면 성능은 저하될 수밖에 없습니다.

SELECT * 대신 필요한 컬럼만 명시하기 🔗

SELECT *는 모든 컬럼의 데이터를 가져오므로 매우 편리하지만, 성능에는 좋지 않은 영향을 줍니다.

WHERE 절에서 데이터 범위 좁히기 🔗

당연한 말처럼 들리지만, WHERE 절을 통해 최대한 처리해야 할 데이터의 양을 줄이는 것이 중요합니다.
LIMIT을 사용하여 가져올 데이터의 수를 제한하는 것도 좋은 방법입니다.

🚀

주요 면접 예상 질문 🔗

쿼리 최적화는 개발자의 데이터베이스 이해도를 직접적으로 보여주기 때문에, 면접에서 자주 다루어집니다.

1. 느린 SQL 쿼리를 발견했을 때, 어떻게 최적화 과정을 진행하시겠어요? 🔗

먼저 EXPLAIN을 사용하여 해당 쿼리의
실행 계획
을 분석하겠습니다.
실행 계획을 통해 풀 테이블 스캔이 발생하는지, 인덱스를 적절히 사용하고 있는지 등을 확인합니다.
만약 인덱스를 사용하지 못한다면, WHERE 절이나 JOIN 조건에 사용된 컬럼에
인덱스를 생성
하거나, 인덱스 컬럼에 함수 사용 등
인덱스를 방해하는 요소를 제거
하겠습니다.
그다음으로는, SELECT * 대신
필요한 컬럼만 명시
하고, WHERE 절을 더 효율적으로 수정하여 불필요한 데이터 조회를 줄이는 방향으로 쿼리를 개선하겠습니다.

2. SELECT *를 사용하는 것이 왜 성능에 좋지 않은가요? 🔗

단순히 '쓰지 말라'는 규칙을 넘어, 그 이유를 깊이 있게 이해하고 있는지 묻는 질문입니다.
첫째, 불필요한 데이터까지 전송되어
네트워크 오버헤드
가 발생합니다.
둘째, 데이터베이스 서버가 더 많은 데이터를 처리해야 하므로
메모리 사용량
이 늘어납니다.
마지막으로, 쿼리에 필요한 모든 컬럼이 인덱스에 포함되어 있을 때 테이블에 접근하지 않고 인덱스만으로 결과를 반환하는
'커버링 인덱스'
최적화 기회를 사용할 수 없게 만들기 때문입니다.

🚀

결론 🔗

오늘은 SQL 쿼리 성능을 최적화하는 체계적인 접근법에 대해 알아보았습니다.

참고 🔗