요즘 많은 분들이 SQL을 통해서 데이터를 조회하고 추출합니다. 예전에는 DBA 분들이 주로 SQL을 통해서 데이터를 조회하고 추출하였습니다. 하지만 이제는 데이터 분석가, 사업, 기획, 개발 많은 분야에서 다양한 분들이 SQL을 통해서 데이터를 조회 및 추출을 합니다.
이렇게 많은 분들이 사용하다 보니 비전문가가 많아서 성능을 고려하지 못하고 SQL을 쓰는 사례가 많아졌습니다. 이는 자칫 실서버 또는 분석용 서버에 무리를 주는 경우가 있어서 이러한 부분을 조금이라도 줄이기 위해서 글을 작성합니다.
이 글의 경우 mysql , google big query에서 테스트하였습니다. (2020 기준으로 회사에서 2개를 사용)
인덱스가 1개 1 컬럼이면 별로 상관이 없는데 1개의 인덱스에 2개 이상의 컬럼이 있는 복합 인덱스의 경우가 있습니다.
예시를 보면서 확인하면 쉽게 이해가 됩니다. 제가 생성한 log_data_test 테이블에는 log_type, log_date_KST으로 복합 인덱스가 걸려 있습니다. log_type가 먼저 앞에 있습니다. 이럴 경우 위와 같이 가공하지 않고 log_date_KST를 이용해서 데이터를 조회해보겠습니다.
이상합니다. 분명히 좌변을 가공하지 않았는데 매우 성능이 좋지 못하고 인덱스도 활용하지 못하였습니다.
실제로 조회를 하였을 때도 시간이 오래 걸립니다.
36초가 걸렸습니다. 아까 좌변을 가공했을 때와 거의 비슷합니다.
이는 인덱스를 전혀 활용하지 못한다는 뜻입니다.
이 경우 해결 방법이 2가지가 있습니다.
첫 번째 log_date_KST로 인덱스를 새롭게 생성하는 것입니다.
두 번째 강제로 log_type 컬럼을 WHERE 조건에 넣습니다.
첫 번째 방법의 경우 인덱스 생성을 DB 담당자에게 부탁하면 되겠지만 인덱스를 실시간으로 생성할 경우 많은 이슈가 있습니다. 그래서 보통은 그렇게 하지 않고 두 번째 방법을 사용합니다.
두 번째 방법을 사용하려면 log_type이 무엇이 있는지 봐야 합니다.
보시면 2가지 타입밖에 없습니다.
이를 어떻게 활용하면 될까요?
인덱스를 강제로 태우기 위해서 WHERE 조건에 현재 있는 타입을 모두 넣고 그다음에 log_date_KST 조건을 넣습니다.
이렇게 하면 결과는 똑같습니다.
그렇다면 소요시간은 얼마나 될까요?
보시면 1.6초입니다. 물론 가장 좋은 방법은 log_date_KST로 인덱스를 만드는 것이지만, 그 방법이 안될 경우 위와 같이 하면 쉽게 해결 가능합니다.
마치며...
위의 2가지만 알아도 DB 담당자에게 많이 사랑받을 것이고, (제가 실제로 사랑했습니다.) 많은 성능 향상 , 속도 향상 , 비용 감소(빅쿼리)를 체감할 수 있습니다. 아주 간단하지만 아주 막강한 내용이므로 꼭 알고 계시면 큰 도움이 될 것이라고 생각됩니다.
실제 사용하는 데이터베이스에서는 이러한 부분이 매우 중요하게 작용하며 아마도 개발 하실 때도 이를 활용하면 빠르게 원하는 결과를 확인 할 수 있을 것 같습니다.