데이터베이스 개발자 질문과 답변 게시판
데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
employee테이블이 있다고 할 때
emp_seq
emp_name
emp_id
emp_sex
emp_entering_date
이런 식으로 컬럼이 있다고 할 때요.
emp_entering_date 이 컬럼은 입사일이며, 날짜형식으로 저장이 되어있고, 2014년 3월~2014년 7월 입사한 사원을 구하라!
라고 했을 때
convert(varchar(10),emp_entering_date,126) >= '2014-03-01' and convert(varchar(10),emp_entering_date,126) <= '2014-07-31'
이러한 방식으로 검색조건을 줬습니다.
헌데, 현재 제가 근무하는 회사에서 자주 쓰는 테이블에 컬럼수는 5백만가량의 데이터가 있고
위와 같이 할 때 특정회원들(데이터 많은 회원)은 속도가 상당히 느려지기 때문에 좀 알아 본 결과
convert emp_entering_date between convert(datetime, '2014-03-01 00:00:00.000') and convert(datetime, '2014-07-31 00:00:00.000')
이러한 방식이 위의 방식에 비하면 형변환을 한 번만 하게 되니 더 빠르다고 알게되었고, 실제 체감할 수 있었습니다.
분단위 쿼리가 초단위로 바뀌었으니까요.
헌데, 욕심도 생기고, 금방 떠야 할 웹페이지가 두자리수의 초단위로 출력이 되니... 뭔가 수정을 가해야 겠다고 생각되는데요.
인덱스를 걸려고 했습니다만, 위의 쿼리처럼 날짜조건만 들어가는게 아니고, 여러가지 컬럼들이 조건에 들어갑니다.
employee테이블을 예로 든다면,
어떤 페이지는
emp_id
emp_entering_date
가 조건으로...
또 어떤 페이지는
emp_sex
emp_entering_date
가 조건으로...
그래서 각 페이지들에 쓰이는 검색조건들의 컬럼을 전부 인덱스로 생성하려보니
10개가 넘어가네요;;;
인덱스는 검색조건에 해당되는 컬럼들로 생성해야 성능이 좋아지는것으로 알고있는데,
이러한 경우에는 어떤식으로 속도향상을 기대할 수 있을까요?
음...일단 맨 위에꺼만 답변을 드리면
날짜 컬럼을 Convert한다음 조건을 주면 인덱스를 사용하지 못합니다.
쉽게 예를 들면
SQL 관련 책의 맨 뒤에 인덱스를 이용해서 "클러스터드 인덱스"라는 페이지를 찾으세요 그러면 빨리 찾겠지만
키워드 중에 중간에 "클러스터드"라는 말이 들어가는 페이지를 찾으세요!! 라고 하면 어떻게 될까요?
인덱스를 처음부터 끝까지 눈으로 훑으면서 "클러스터드"를 찾아야 합니다. 이건 인덱스 스켄이죠.