Knowhow | 인덱스와 성능에 관한 고찰
시스템 하나를 구축할 때 운영 측면에서 보면 시스템 개발(SI)과 운영(SM), 두 단계로 나눌 수 있고 SI와 SM을 담당하는 개발자는 상이한 것이 보통이다. SI 단계에서 개발자나 프로젝트 관리자들은 주로 데이터 정합성과 정확성을 위주로 코드를 검증하는데, 사실 이 단계에서 테이블에 있는 데이터는 테스트 데이터다. 즉, 데이터 건수가 그리 많지 않다. 하지만 SM 단계에 접어들면 데이터는 점점 쌓이고 본격적으로 성능 이슈가 발생한다. 이때, SM 담당자들은 개발된 코드를 보면서 불평을 늘어 놓고 SI 개발자들은 공공의 적이 되는 경우가 적지 않은 것이 현실이다.
성능 문제가 발생하면 누구나 제일 처음 생각해내는 해결책이 인덱스 추가 생성이다. SI 단계에서 향후 성능까지 고려해 개발하는 것은 현실적으로 쉽지 않으며, 추가적인 인덱스 생성이 필요한 것이 사실이다. 그래서 새로운 인덱스를 추가로 만드는 것이 보통이지만, 이렇게 처리하면 당장의 문제는 해결될 수 있지만(꼭 해결된다고 장담할 수는 없다), 또 다시 다른 SQL문에서 느려지는 현상이 발생한다. 그럼 또 새 인덱스를 만들어야 할까? 앞서 말했듯이 인덱스를 많이 만드는 것은 다른 성능 부하를 초래한다. 그렇다면 어떻게 해야 할까?
“이럴 때는 이렇게 하라”라는 정답이 존재하는 건 아니다. 사실 성능 문제는 논리적, 물리적 DB 설계 때부터 고민해야 하는 사항이며, 관련된 업무와 이에 따라 작성해 놓은, 그리고 작성할 SQL문의 구조, 데이터 분포도 등의 사항도 고려 대상에 포함된다. 개발자 입장에서 이런 제반 사항을 고려해 필자 나름대로 정의한 성능 문제 해결 5원칙은 다음과 같다.
❶ 어떤 컬럼을 인덱스로 만들 것인지, 인덱스는 몇 개나 만들 것인지(최대 5개를 넘어가지 않도록 한다) 결정한다.
❷ 효율적인 SQL문을 제대로 작성한다.
❸ 효율적인 SQL문을 제대로 작성한다.
❹ 효율적인 SQL문을 제대로 작성한다.
❺ 효율적인 SQL문을 제대로 작성한다.
오타인가? 전혀 그렇지 않다!!! 그만큼 효율적인 SQL문 작성이 중요하며, 아무리 강조해도 지나치지 않다. 인덱스만 만들었다고 끝이 아니며, 인덱스를 제대로 사용하도록 SQL문을 작성하는 것이 중요하다.
데이터 정합성과 정확성이 보장된 후, 효율적인 SQL문을 작성하는 것은 바로 SQL 튜닝 영역에 속하는데 SQL 튜닝은 내용도 방대하며 어렵고 복잡해 이 책에서 다루기는 힘들지만, 필요한 부분이 나오면 기본적인 내용에 한해 그때마다 간단하게 다루도록 하겠다.