데이터베이스 개발자 질문과 답변 게시판
데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
안녕하세요
로그 테이블 관련해서 데이터를 조회하는데 너무 느려서 이것저것 튜닝할 곳이 어디 있는지 열심히 찾아보는 중입니다.
SELECT U_ID, COUNT(U_ID) CNT
FROM E_LOG WITH(readuncommitted)
WHERE E_ID = 'event_121204'
AND CONVERT(VARCHAR, RDATE , 112) BETWEEN CONVERT(VARCHAR, '20121203', 112) AND CONVERT(VARCHAR, '20121203', 112)
GROUP BY U_ID
ORDER BY CNT DESC
위와 같은 쿼리를 실행하니 30분이 넘게 소요됩니다.
그리고 E_ID 와 RDATE는 넌 클러스터드 인덱스가 걸려 있구요.
위에 AND RDATE 부분만 빼면 인덱스를 타고 아주 빠르게 데이터를 가져 올 수 있는데 RDATE 부분 때문에 30분이 넘게 걸리는 것입니다.
그래서 RDATE 부분의 쿼리를
AND RDATE >= '20121203' AND RDATE < DATEADD(day, 1, '20121203')
AND RDATE BETWEEN '2012-12-03 00:00:00.000' AND '2012-12-03 23:59:59.997'
AND RDATE BETWEEN CONVERT(datetime, '2012-12-03 00:00:00.000') AND CONVERT(datetime, '2012-12-03 23:59:59.997')
이 세가지를 모두 해봐도 인덱스를 타지 않네요.
이것저것 테스트 해보니 WHERE 조건에 한가지만 쓰면 인덱스를 타는데 E_ID, RDATE 둘 다 쓰면 인덱스를 안타는 문제인 것입니다.
이에 대한 해결 방법을 알고 싶습니다..ㅜㅠ 몇시간째 테스트 해보는데 방법을 못찾겠네요.
Comment 6
-
탱소연
2012.12.04 16:27
-
FeLLEN
2012.12.04 16:29
답변 고맙습니다.
그렇잖아도 E_ID와 RDATE는 함꼐 ASC로 인덱스 걸려 있습니다..ㅜ.ㅜ
-
탱소연
2012.12.04 16:41
후억.. 그렇군요;;;
RDATE 없을떄는 타는데 같이 하면 안탄다고하셔서 없는줄알았네요;;;;;
with 절에 index힌트 지정해서 타게해도 안되려나여 ;;ㅋ
-
FeLLEN
2012.12.04 16:56
아아.. 탱소연 정말 고맙습니다!!! 해결 되었습니다 ..ㅠ_ㅜ 30분 걸리던게.. 2초만에 가져오네요!!SELECT U_ID, COUNT(U_ID) CNTFROM E_LOG WITH(INDEX(IX_E_LOG_EID), readuncommitted)WHERE E_ID = 'event_121204'AND RDATE BETWEEN '2012-12-03 00:00:00.000' AND '2012-12-03 23:59:59.997'GROUP BY U_IDORDER BY CNT DESC -
탱소연
2012.12.04 16:58
오..ㅋ다행이네여 ㅎㅎㅎ 좋은 하루 되세요 ㅎㅎ
-
진윤호
2012.12.05 11:47
index가 있는 컬럼을 가공하면 인덱싱이 안된다는 글을 언젠가 본거 같네요
지금 where 절에 있는 것 처럼 검색하는 경우가 많으면
E_ID 와 RDATE를 묶어서 넌클러스터를 하나더 만드는게 어떨까여;;;
그냥 지나가는 행인이 댓글 달아봅니다;..;;