[초보문의] 쿼리 좀 봐주세요~ ㅜㅜ (실행계획, 비용, 속도관련) 0 6 14,769

by 자꾸그래 실행계획 [2009.06.30 17:23:26]


안녕하세요?

이해가 잘 되지 않은 부분이 있어 도움을 구하고자 이렇게 글을 쓰게 되었습니다.

실행계획과 실제 쿼리 수행속도에 관한 내용인데요.

실행계획에서의 Cost 비용이 적게 나온것이 실제 쿼리를 실행시킨 속도가 늦게 나오는 현상이 발생합니다.

 

* 테스트 정보

 - Oracle 10g 사용, Orange Tool 사용하여 측정

 - A Table 의 결합인덱스 : I_INDEX ( YYMM + B + C + D + ...)

 

실행쿼리 1

         

실행쿼리 2

SELECT *

    FROM  A

WHERE  yymm BETWEEN ’200901’ AND ’200906’

     AND  B컬럼 = ’OK’

     AND   C컬럼 = ’OK’

 

SELECT /*+ INDEX( A I_INDEX ) */

              *

   FROM A

WHERE yymm BETWEEN ’200901’ AND ’200906’

     AND B컬럼 = ’OK’

     AND C컬럼 = ’OK’

 

실행계획 1

         

실행계획 2

 Optimizer=ALL_ROWS

 TABLE ACCESS (FULL) OF ’A’ (TABLE)

 ( Cost = 452K Card = 3M Bytes = 286M )

 

 Optimizer=ALL_ROWS

 TABLE ACCESS (BY INDEX ROWID) OF ’A’ (TABLE)

 ( Cost = 554K Card = 3M Bytes = 286M )

 

쿼리수행시간1

         

쿼리수행시간 2

 14.78 sec

 

 0.09 sec

 

위에서 보면 실행계획1의 비용이 실행계획2보다 적게 나타나는데도 실제 수행시간은 더 많이 걸리는 현상이 발생합니다.

어떤경우에 이런현상이 나타날수 있나요?

(참고 : 테이블 A 및 인덱스에 대해서는 최근에 Analyze 작업을 하고 테스트 하였습니다.)

 

by 혈기린 [2009.06.30 18:07:43]
실행계획2 가 저렇게 나오나요 저런 실행계획은 첨보는데
혹시 Table Access(by index rowid)
index range scan
이렇게 나오는거 아닌가요
그러면 수행시간 차이 나는건 이해가 가는데 Cost는 실제로 가끔 비용은 적은데 수행시간은 휠씬 오래 걸리기도 하고 비용은 높게 나오는데 수행시간은 엄청 오래걸리기도 합니다
그건 비용기반 오라클 책을 보면 여러가지 이유가 나열되어 있습니다.
비용기반 옵티마이저의 버그일수도 있다고 하는군요
하지만 제가 위에 적은 실행계획이 아닌 질문자께서 기술한 실행계획이면 잘 모르겠네요
나머지는 다른 고수분들이

by 웅 [2009.06.30 18:30:37]
실행계획부분을 일부만 편집하신듯..
트레이스는 아닌것 같고..실행계획이신것 같네요.

"실행계획은 실행계획일뿐"..이란 말씀을 먼저 드리고 싶네요.

그냥 cost만 두고 이야기하자면...
일반적으로 위같은 결합인덱스의 선두 컬럼을 범뮈조건을 주면 인덱스를 잘 사용할 수 없어 cost가 적은 full스캔을 타려고 하지만 위처럼 억지로 인덱스힌트를 주면 넓은 범위의 index range scan을 하려고 합니다. 이때 클러스터링 팩터가 나쁘다면 cost계산시 높은 값이 나올 가능성이 있겠네요.

by 자꾸그래 [2009.06.30 19:17:13]
네~ 실행계획부분 중 일부만 올린것 맞구요.
index range scan 으로 인덱스를 사용합니다.

단지 실행계획만으로 성능을 평가하면 안된다는 말씀이시군요.
답변 감사합니다.

by flyhun [2009.07.01 14:29:42]
cost 쪽은 hash 와 nl 조인을 많이 비교하는데요 hash 가 nl 보다 cost 가 월등히 높게 나오지만 결과는 nl 보다 hash 가 더 빠르게 나오는 경우가 많이 있습니다.. 그때 그때 상황에따라 다르지만.. 그리고 cost 를 계산하는것은
아직 오라클에서 공개를 하지 않았습니다.. 사람들이 이렇다 저렇다 내놓은것은
전부 추측성입니다.. '이럴것이다' 라는것이지 '이거다' 는 아닙니다. 여기서 cost base 니 cost 가 낮은 full scan 을 했을듯 한데요..
여기서 보면 실행 계획이 2 일때가 무조건 빠르게 나오는 경우는 아니고 buffer cache 의 hit 율이 낮아진다면 실행계획2가 1보다 현저하게 늦게 나올 수도 있습니다.

by 자꾸그래 [2009.07.01 15:08:11]
flyhun 님 답변 감사합니다.
그때 DB상황에 따라 cost 도 실행속도도 바뀔수 있다는 말씀이시군요.

제가 이 부분을 고민하게 되었던 근본적인 문제는 테이블 파티셔닝 작업을 하면서인데요.
파티셔닝 작업을 한 테이블은 주로 년단위로 데이터 조회가 일어나는 테이블입니다.
그래서 년단위로 파티션을 나누는 작업을 했구요.

파티셔닝 작업을 통해서 성능이 향상이 되었는지 확인을 해보는 과정에서 이런 궁금증이 생겨서 질문을 드렸습니다.
여기서 다른 질문을 하나 더 드리고 싶은데요.

파티셔닝 작업을 한 테이블만 조건을 줘서 조회를 하였을때는 속도가 이전보다 빠르게 나오는데, 다른테이블과 조인을 걸어 조금 복잡한 쿼리를 만들어서 수행을 하니 훨씬 수행속도가 느리게 나옵니다.
이런 경우는 왜 이렇게 속도차이가 나는건지요?

by flyhun [2009.07.03 15:27:14]
오... 파티셔닝.... 힘든걸 하시는군요.. 기가, 테라급의 테이블을 파티셔닝을 통한 성능 분석 및 튜닝.. 오오.... 일단 어떤식으로 돌아가는지 실행계획을 봐야 대충 감이 잡힐 듯 합니다... 그리고 아직... 제 능력이 파티션까지 이용한 성능 분석을 할... -_-;;; 논리, 물리적인 설계까지 하시는걸 보면.. 저희한테 가르킴을 주셔야 할듯 한데요 ㅠㅜ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입