뷰질문 입니다.~ 0 3 2,131

by 구경서 [2008.09.02 13:08:16]


안녕하세요 뷰속도 에대하 여 질문 했다가 여기로 글을 올리게 됐습니다.

좋은글들로 어느정도 감은 잡았지만  속도가 많이 느린 쿼리 하나로 예를 올립니다.

버전 : 10.2.0.4.0

쿼리 :

select distinct tstaff,
       (select staffnm from b03staffinfo where placecd='011036' and staffid=tstaff) staffnm
from (select tstaff from p06ticket_v where to_char(tdate, 'yyyymmdd')>='20080829'
                                       and to_char(tdate, 'yyyymmdd')<='20080829'
                                       and placecd='011036' and trim(tcd)='004'
                                  group by tstaff
                                 union all
      select refund_id from p06ticket_v where to_char(refund_date, 'yyyymmdd')>='20080829'
                                          and to_char(refund_date, 'yyyymmdd')<='20080829'
                                          and  placecd='011036'
                                          and trim(refund_tcd)='004'
                                          and refund_id is not null group by refund_id )


실행계획 :

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |     5 |    35 |   114K  (1)| 00:22:55 |
|   1 |  TABLE ACCESS BY INDEX ROWID| B03STAFFINFO     |     1 |    19 |     2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_B03STAFFINFO  |     1 |       |     1   (0)| 00:00:01 |
|   3 |  HASH UNIQUE                |                  |     5 |    35 |   114K  (1)| 00:22:55 |
|   4 |   VIEW                      |                  |     5 |    35 |   114K  (1)| 00:22:55 |
|   5 |    UNION-ALL                |                  |       |       |            |          |
|   6 |     HASH GROUP BY           |                  |     3 |    93 | 57270   (1)| 00:11:28 |
|   7 |      VIEW                   | P06TICKET_V      |     3 |    93 | 57269   (1)| 00:11:28 |
|   8 |       SORT UNIQUE           |                  |     3 |   937 | 57269   (7)| 00:11:28 |
|   9 |        UNION-ALL            |                  |       |       |            |          |
|* 10 |         TABLE ACCESS FULL   | P06TICKET        |     2 |   614 | 54132   (1)| 00:10:50 |
|* 11 |         TABLE ACCESS FULL   | P06TICKET_REFUND |     1 |   323 |  3135   (1)| 00:00:38 |
|  12 |     HASH GROUP BY           |                  |     2 |    62 | 57235   (1)| 00:11:27 |
|  13 |      VIEW                   | P06TICKET_V      |     2 |    62 | 57234   (1)| 00:11:27 |
|  14 |       SORT UNIQUE           |                  |     2 |   630 | 57234   (7)| 00:11:27 |
|  15 |        UNION-ALL            |                  |       |       |            |          |
|* 16 |         TABLE ACCESS FULL   | P06TICKET        |     1 |   307 | 54095   (1)| 00:10:50 |
|* 17 |         TABLE ACCESS FULL   | P06TICKET_REFUND |     1 |   323 |  3137   (1)| 00:00:38 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("STAFFID"=:B1 AND "PLACECD"='011036')
  10 - filter("PLACECD"='011036' AND TRIM("TCD")='004' AND
              TO_CHAR(INTERNAL_FUNCTION("TDATE"),'yyyymmdd')>='20080829' AND
              TO_CHAR(INTERNAL_FUNCTION("TDATE"),'yyyymmdd')<='20080829')
  11 - filter("PLACECD"='011036' AND TRIM("TCD")='004' AND
              TO_CHAR(INTERNAL_FUNCTION("TDATE"),'yyyymmdd')>='20080829' AND
              TO_CHAR(INTERNAL_FUNCTION("TDATE"),'yyyymmdd')<='20080829')
  16 - filter("REFUND_ID" IS NOT NULL AND "PLACECD"='011036' AND
              TRIM("REFUND_TCD")='004' AND TO_CHAR(INTERNAL_FUNCTION("REFUND_DATE"),'yyyymmdd')>='2008
              0829' AND TO_CHAR(INTERNAL_FUNCTION("REFUND_DATE"),'yyyymmdd')<='20080829')
  17 - filter("PLACECD"='011036' AND TRIM("REFUND_TCD")='004' AND
              TO_CHAR(INTERNAL_FUNCTION("REFUND_DATE"),'yyyymmdd')>='20080829' AND
              TO_CHAR(INTERNAL_FUNCTION("REFUND_DATE"),'yyyymmdd')<='20080829' AND "REFUND_ID" IS NOT
              NULL)

설명:

간략한 설명입니다.
po6ticket_v 가 p06ticket 발권된 티켓 정보
               p06ticket_refund 환불된 티켓 에 대한 정보를 가지고 있습니다
b03staffinfo 는 알바생들 정보를 가지고 있습니다.

 

티켓 테이블에서 환불이 일어나면 티켓 테이블에서 지워지고
환불 테이블로 이동하게 됩니다.
두테이블의 구조는 동일합니다.

b03staffinfo
staffnm     :알바생이름
staffid     :알바생 ID   :index 있음


p06ticket_v
tdate       : 발권일시
tstaff      : 발권한 알바 ID
tcd         : 발권한 창구

refund_date : 환불일자
refund_tcd  : 환불한 창구
refund_id   : 환불한 알바 ID
placecd     : 점포CD         :index 있음


쿼리는 점포와 날자 창구 번호를 선택하면
그창구에서 발권 하거나 환불한 알바 이름들이 나오게됩니다.

예를 든다고 성능이 안나오는 쿼리를 올렸지만 다른 상당수의 쿼리가 실행계획의 12 ~ 17 이 빠지질 않습니다

by 강정식 [2008.09.02 14:22:27]
글을 지금 보았습니다.

추가 정보를 요청드립니다.

1. po6ticket_v 뷰 안의 SQL
2. P06TICKET, P06TICKET_REFUND 테이블 안의 모든 인덱스 정보

by 구경서 [2008.09.02 15:13:07]
메일주소 하나 남겨주시겠습니까....

by 강정식 [2008.09.02 15:18:38]
xsofter@empal.com
입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입