본문 바로가기

Dev. Database

인덱스와 성능에 관한 고찰

[출처]  오라클 SQL과 PL/SQL을 다루는 기술


시스템 하나를 구출할 때 운영 측면에서 보면 시스템 개발과 운영, 두 단계로 나눌 수 있고 SI와 SM을 담담하는 개발자는 상이한 것이 보통이다. SI 단계에서 개발자나 프로젝트 관리자들은 주로 데이터 정합성과 정확성을 위주로 코드를 검증하는데, 사실 이단계에서 테이블에 있는 데이터는 테스트 데이터이다. 즉, 데이터 건 수가 그리 많지 않다. 하지만 SM 단계에 접어들면 데이터는 점점 쌓이고 본격적으로 성능 이슈가 발생한다. 이 때, SM 담당자들은 개발된 코드를 보면서 불평을 늘어 놓고 SI 개발자들은 공공의 적이 되는 경우가 적지 않은 것이 현실이다.


  성능 문제가 발생하면 누구나 제일 처음 생각해내는 해결책이 인덱스 추가 생성이다. SI 단계에서 향후 성능까지 고려해 개발하는 것은 현실적으로 쉽지 않으며, 추가적인 인덱스 생성이 필요한 것이 사실이다. 그래서 새로운 인덱스를 추가로 만드는 것이 보통이지만, 이렇게 처리하면 당장의 문제는 해결될 수 있지만(꼭 해결된다고 장담할 수는 없다.) 또 다시 다른 Sql문에서 느려지는 현상이 발생한다. 그럼 또 새 인덱스를 만들어야 할까? 앞서 말했듯이 인덱스를 많이 만드는 것은 다른 성능 부하를 초래한다. 그렇다면 어떻게 해야 할까?


  "이럴 때는 이렇게 하라"라는 정답이 존재하는 건 아니다. 사실 성능 문제는 논리적, 물리적 DB 설계 때부터 고민해야 하는 사항이며, 관련된 업무와 이에 따라 작성해 놓은, 그리고 작성할 SQL문의 구조, 데이터 분포도 등의 사항도 고려 대상에 포함된다. 개발자 입장에서 이런 제반 사항을 고려해 필자 나름대로 정의한 성능 문제 해결 5원칙은 다음과 같다.


1. 어떤 컬럼을 인덱스로 만들 것인지, 인덱스는 몇 개나 만들 것인지(최대 5개를 넘어가지 않도록) 결정한다.

2. 효율적인 SQL문을 제대로 작성한다.

3. 효율적인 SQL문을 제대로 작성한다.

4. 효율적인 SQL문을 제대로 작성한다.

5. 효율적인 SQL문을 제대로 작성한다.


오타인가? 전혀 그렇지 않다 !!! 그만큼 효율적인 SQL문 작성이 중요하며, 아무리 강조해도 지나치지 않다. 인덱스만 만들었다고 끝이 아니며, 인덱스를 제대로 사용하도록 SQL문을 작성하는 것이 중요하다.