데이터이야기

DB 노하우, 데이터직무, 다양한 인터뷰를 만나보세요.

지금 우리에게 필요한 것은 데이터베이스 성능 최적화이다 (2부)

데이터 이야기
작성자
dataonair
작성일
2014-12-13 00:00
조회
4523


잘못 알고 있는 사실을 이제는 버리자.

우리 주위에는 성능 최적화에 대한 잘못된 많은 사실들이 존재한다. 이러한 오해를 버리지 않는다면 우리가 원하는 성능 최적화를 수행할 수 없을 것이다. 성능 최적화에 대해 우리가 잘못 알고 있는 사실들을 확인해 보자.

첫 번째로 예전이나 지금이나 데이터베이스는 동일하다라는 사실에 대해 확인해 보자. 이러한 부분은 특히 관리자의 잘못이 크다. 자신이 관리자라는 이유 하나만으로 자신의 판단이 무조건 옳다는 생각을 버리기 바란다. 주위를 둘러보면 이와 같은 관리자가 생각보다 많은 것이 IT의 현실인 것 같다. 절대 자신이 실무자로 업무를 수행했을 때의 환경과 지금의 환경을 절대적 기준아래에서 비교하지 않기를 바란다. 예전에는 데이터가 100GB가 되어도 대용량 데이터베이스라고 부르던 시절이 있었다. 이런 환경에서 실무를 했던 사람이 시간이 지나 지금은 관리자가 되어 있을 것이다. 이러한 것이 문제라는 것이 아니다. 당연히 오랜 기간의 경험과 기술을 가지고 프로젝트를 관리하거나 또는 시스템을 관리의 책임을 수행하는 것은 당연한 일이다. 문제는 이와 같은 것이 아니고 과거 본인이 관리하던 시절과 절대적 기준으로 동일하게 생각한다는 것이다. 이는 시스템을 함정에 빠뜨리는 결과를 초래하게 된다. 100GB의 데이터베이스에서 데이터 엑세스를 최적화하는 것과 10TB의 데이터를 엑세스하는 것은 전혀 다른 세상의 이야기이기 때문이다.

두 번째로 데이터 연결은 성능 저하를 발생시킨다에 대한 사실을 확인해 보자. 어떤 사이트를 지원하다 보면 여러 테이블에서 데이터를 엑세스하기 위해 사용하는 조인 또는 서브쿼리를 사용하지 못하게 하는 경우를 보았다. 물론, 조인 또는 서브쿼리를 사용하지 못하게 하는 대부분은 관리자들일 것이다. 이와 같이 말하는 소수의 관리자들이 과연 조인과 서브쿼리의 실행 원리 및 특징을 정확히 이해하고 있는지 의문이다. 조인과 서브쿼리의 실행 원리 및 특징을 정확히 이해하고 있다면 이와 같이 이야기하지는 않았을 것이다.

데이터의 연결은 RDBMS의 꽃이다. 여기서 꽃이라는 것은 무엇인가 가장 중요하고 핵심이

되는 아키텍쳐라는 뜻이다. 이러한 이유 하나만으로도 데이터의 연결은 우리에게 많은 혜택을 제공해 줄 수 있을 것이다. 이와 같은 데이터 연결을 사용하지 않고 단일 테이블을 생성하여 데이터를 엑세스하는 것은 RDBMS를 사용하지 말라고 하는 것과 무엇이 다르겠는가 물론, 데이터 연결을 사용하지 말라고 말한 사람은 데이터 연결에 의해 성능 저하를 경험해 보았기 때문일 것이다. 하지만, 이와 같은 성능 저하는 데이터 연결의 정확한 아키텍쳐를 이해하지 못하기 때문에 발생하는 현상임에 틀림 없다. 이와 같이 정확히 이해하지 못하고 잘못 사용하여 경험하게 된 데이터 연결에 의한 성능 저하를 일반적인 사실로 보편화 시켠 모든 사이트에서 사용하지 못하게 하는 것은 매우 위험한 행동임에 틀림 없다.

세 번째로 인덱스를 이용하는 것이 SQL의 성능을 향상시킨다에 대한 사실을 확인해 보자. 어떤 사이트에서는 SQL을 최적화하는 과정에 해당 SQL이 인덱스를 이용하지 않는다면 인덱스를 이용할 수 있게 인덱스를 생성하거나 또는 인덱스를 이용할 수 있게 SQL을 변경하여 SQL 최적화를 수행하는 것을 많이 보았다. 이와 같이 인덱스를 이용하게 SQL을 최적화 하는 것이 문제라는 것은 아니다. 문제는 어떤 SQL이 인덱스를 이용하고 어떤 SQL은 인덱스를 이용하면 안 되는 지에 대한 기준이 존재하는가 이다. 대 부분의 사이트에서는 SQL에 대해 인덱스를 이용해야 할지 이용하지 말아야 할지에 대한 기준이 없는 경우가 많다. 이는 무엇을 의미하는 것인가 모든 SQL이 인덱스를 이용한다면 데이터 엑세스를 수행하는 부분에서 최적화된다는 의미인가 데이터 엑세스를 수행하는 과정에서 어느 정도의 데이터를 엑세스하는 지에 따라 인덱스를 이용하는 경우가 유리할 수도 있으며 반대로 인덱스를 이용하지 않는 경우가 인덱스를 이용하는 경우가 더 유리할 수 있다.

중요한 것은 모든 SQL이 인덱스를 이용하게 되면 해당 시스템은 성능 문제를 발생시킬 가능성이 높아지게 된다. 그렇다면 인덱스를 이용할지 아니면 인덱스를 이용하지 않을 지의 기준은 무엇인가 전체 데이터에 대한 엑세스 양에 따라 인덱스를 이용할지 안 할지를 결정해야 한다. 전체 데이터에 대해 적은 데이터를 엑세스한다면 반드시 인덱스를 이용해야 하며 전체 데이터 중에 많은 데이터를 엑세스한다면 해당 SQL은 인덱스를 이용해서는 안 된다. 그렇다면 과연 많은 데이터와 적은 데이터의 기준은 어떻게 되는가 예를 들어, 100만 건의 데이터를 저장하고 있는 테이블이 존재한다고 가정하자. 해당 테이블의 데이터 중 2만 건의 데이터를 엑세스한다면 적은 데이터를 엑세스하는 것이고 10만건의 데이터를 엑세스한다면 이는 많은 데이터를 엑세스하는 경우에 해당될 수 있다. 이는 해당 테이블의 3%~5% 미만의 데이터를 엑세스한다면 적은 데이터를 의미하게 되고 그 이상의 데이터를 엑세스하게 되면 많은 데이터를 의미하기 때문이다. 이와 같은 기준은 테이블의 데이터가 증가하면 증가할수록 감소하게 된다. 1,000만 건의 데이터를 저장하고 있는 테이블의 경우에는 3%~5%가 기준이 아니면 1%가 기준이 될 수도 있다. 이러한 기준은 해당 시스템의 여러 자원 및 디스크의 속도에 의해 좌우된다. 여기서 중요한 사실의 기준 값이 아니라 테이블의 데이터 중 많은 데이터를 엑세스하는 SQL은 인덱스를 이용해서는 안 된다는 것이다. 물론, 해당 테이블의 데이터 중 적은 데이터를 엑세스하는 경우에는 성능을 고려하여 인덱스를 이용해야 하는 것은 당연한 사실이다.

이제는 더 이상 SQL의 성능을 위하여 반드시 인덱스를 사용해야 한다는 잘못된 생각을 버리기 바란다. 인덱스를 이용하지 않는 경우가 더 좋은 성능을 보장할 수 있다는 사실을 기억하길 바란다.

네 번째로 디스크 분산은 디스크 업체에서 책임진다에 대한 사실을 확인해 보자. 어떤 서적에서는 인덱스를 위한 디스크와 테이블을 위한 디스크를 분리하여 디스크에 저장해야 성능을 최적화할 수 있다고 말한다. , 어떤 사람들은 디스크 업체에서 디스크를 이미 최적으로 분산해서 설정하기 때문에 데이터를 어느 디스크에 저장하는가는 그렇게 중요하지 않다고 말한다. 이러한 말들이 맞는 말인가 이는 데이터베이스의 공간 할당과 디스크와의 분산을 정확히 이해하지 못하기 때문에 발생하는 현상이라고 생각한다. 이와 같은 말들은 더 이상 진실이 아니다. 대용량 데이터베이스에서 이와 같이 시스템을 구축한다면 성능 저하를 발생시키게 된다. 물론, 데이터베이스의 종류에 따라 차이는 존재하며 여기서는 오라클의 경우이다.

최적화된 데이터 분산을 수행하기 위해서는 반드시 준수해야 할 법칙이 있다. 그것은 모든 데이터가 모든 디스크로 분산될 때에만 진정한 디스크 분산이 이루어진다는 것이다. 이러한 규칙이 지켜지지 않는다면 이는 더 이상 디스크 분산은 최적화된 것이 아니다. 이제부터 디스크 업체에서 제공되는 그 자체만을 그대로 이용하는 것이 아니라 데이터베이스의 특성에 맞게 최적의 분산을 수행하여 디스크 I/O 성능을 최적화해야 할 것이다.

다섯 번째로 테이블의 할당 공간에 해당하는 익스텐트(Extent)의 개수가 많다면 성능이 저하된다에 대한 사실을 확인해 보자. 대용량 테이블의 익스텐트를 작게 설정하면 연락을 해서 왜 익스텐트를 작게 설정했는가에 대해 질문을 하는 경우가 많다. 연락을 한 사람은 익스텐트의 크기를 작게 설정할 경우 대용량 테이블의 경우 많은 익스텐트가 할당되며 익스텐트의 개수가 많아 진다면 성능이 저하된다고 주장한다. 필자가 왜 그렇게 생각하는가에 대해 물어 보면 대답은 선배에게 그렇게 배워왔다고 말하곤 한다. 이 얼마나 어리석은 생각인가 정확한 이론과 지식 없이 단지 선배의 말만을 듣고 잘못된 사실을 진실인 것처럼 믿고 있다는 사실이 너무 놀랍지 않은가 분명한 것은 익스텐트의 개수와 성능과는 어떠한 연관 관계도 없다. 차라리 익스텐트 개수를 작게 설정한다면 성능 향상을 기대할 수 있다.

이외에도 우리 주의에는 성능 최적화 관련 많은 잘못된 사실이 존재한다. 안타까운 것은 아직도 많은 곳에서 이와 같은 잘못된 사실을 진실로 믿고 시스템에 적용하는 경우가 발생한다는 것이다. 이제는 더 이상 이와 같은 오류를 발생시키지 말아야 할 것이다. 이러한 잘못된 사실로 인해 프로젝트를 실패한다면 너무 안타까운 일이 아니겠는가

여기서는 우리 주위에서 발생하는 성능 관련 잘못된 사실에 대해 확인해 보았다. 다음 호에서는 이와 같이 우리 주위에서 접하게 되는 잘못된 사실을 정확히 분석해 보고 이를 통해 우리가 어떤 방향으로 성능 최적화를 해야 할 지에 대한 실마리를 찾아보도록 하자.