MSSQL 2000 및 2005의 페이징 기법들

어제 악성 쿼리를 고치면서 MS-SQL 2000,2005 페이징 기법에 적힌 기법을 모두 비교해봤다. 내가 처음에 사용했던 방법은 Top 키워드를 이용한 페이징 기법이었다. 예전엔 RowCount 키워드를 이용한 페이징 기법을 주로 썼지만, 한동안 SQL을 손 놓고 있었더니 어떻게 짜는지 금방 떠오르지 않아 생각나는대로 짰다. 결국 그렇게 안일하게 생각하다 악성 쿼리로 지목 받게 된 것이다.

쿼리 튜닝은 그때그때 상황에 맞춰야 한다. 어느 칼럼에 인덱스가 있는지, 혹 인덱스를 추가해도 문제는 없는지, 데이터의 통계 및 분포는 어떤지 등등 고려할 점이 많다. 그래서 이 세 가지 기법 중 어느 것이 최고다라고 단정지을 수는 없지만, 적어도 문제가 된 테이블에선 세번째 기법이 가장 우수했다. MSSQL 2005에 도입된 Common Table Expression (CTE)를 이용한 방식이 적게는 0.3배에서 많게는 수백배 정도 빨랐다. 안타깝게도 해당 데이터베이스에 대한 쿼리 분석 권한이 없기 때문에 실제 실행계획은 어떤지 보고 분석하진 못했다. 데이터베이스 관리자들이 직접 분석하고 검수해주던가, 아니면 최소한의 분석 권한을 주던가 해야 할텐데, 계속 이런 식으로 해야 하는지 걱정이다. 일단은 이 방식대로 쿼리를 고쳐서 좀더 상황을 지켜봐야겠다.

부연. 쿼리를 만들어달라는 요청(또는 요구)이 가끔 있는데, 이때 반드시 고려해야 할 것이 있다. 바로 그 쿼리를 얼마나 자주 쓰는지 그 빈도부터 알아야 한다. 새벽녘에 딱 한번 도는 쿼리라면 테이블 스캔을 한들 큰 문제가 안 될 수 있다. 그에 반해 초 단위로 수행되는 쿼리라면 그 속도가 아무리 빠르더라도 문제의 소지가 있다. 이런 경우엔 메모리 데이터베이스를 도입하는 방식도 고려해볼만 하다.

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu