속도가 너무 느린데 원인을 모르겠어요... 0 2 1,915

by poodle 서브쿼리 튜닝 [2017.07.21 18:08:09]


안녕하세요~

쿼리 속도가 너무 느려 튜닝에 조언을 구하고자 합니다.

실행계획은 빠르게 나오는데 실제로 돌리면 7초이상이 걸려요

원인이 뭔지 궁금합니다.

대충 쿼리 설명을 드리면  입력을 예산연도와 추산번호를 받구요

추산번호와 예산번호로 이월여부와 추산금액과 증감추산 금액을 구하고

추산 이월여부로와 예산부서 과목코드로 배정액을 구합니다. 추산번호로 원인 seq를 구해서 결의 번호를 조회하여

결의번호로 결의테이블의 결의금액과 결의 반납 금액을 조회합니다.

증감추산T,결의반납T은 서브 테이블로 데이터가 없을수도 있습니다.

           SELECT 
               예산연도, 예산부서, 과목코드, 추산번호
               ,sum(추산액) 
                - (
                    select nvl(sum( decode(추산구분,2,amt,-amt)),0)  -- 2증추산 3감추산 4반납
                    from 증감추산T
                    where 예산연도=apc.예산연도 and 승인여부='Y' and 추산번호=apc.추산번호
                  ) 추산액
               ,(  select sum(alo_amt) alo_amt 
                    from  배정T alo 
                    where alo.예산연도='2017'
                    and alo.예산부서=apc.예산부서
                    and alo.과목코드=apc.과목코드
                    and 승인여부='Y'
                    and DECODE(추산이월구분, '10', 'Y', 'N') =  DECODE(배정이월구분, '10', 'Y', 'N')) alo_amt
                ,( 
                    select sum(결의액)-sum(nvl(RTN.결의반납액,0))
                    from 결의T cex
                    left outer join 결의반납T rtn on  rtn.예산연도='2017' and rtn.예산부서=cex.예산부서 and rtn.승인여부='Y'
                                                and rtn.cex_seq in (cex.cex_seq) 
                    where cex.예산연도='2017' and cex.예산부서=apc.예산부서 and cex.승인여부='Y' and cex.원인번호 in (select 원인번호 from 원인T cau where 예산연도='2017' and cau.예산부서=apc.예산부서 and cau.추산번호=apc.추산번호)
                    )  결의액
            FROM 추산T apc
           WHERE 예산연도 = '2017' 
           AND 추산번호='10855'
           AND 승인여부='Y'
           group by  예산연도, 예산부서, 과목코드,추산번호, 추산이월구분


Plan hash value: 4103564949
-------------------------------------------------------------------------------------------------
 | Id  | Operation                       | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |               |     1 |    46 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE                 |               |     1 |    19 |            |          |
|*  2 |   TABLE ACCESS FULL             | 증감추산T    |     1 |    19 |     5   (0)| 00:00:01 |
|   3 |  SORT AGGREGATE                 |               |     1 |    41 |            |          |
|*  4 |   TABLE ACCESS BY INDEX ROWID   | 배정T       |     1 |    41 |     8   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN             | 배정T_AK1   |     5 |       |     3   (0)| 00:00:01 |
|   6 |  SORT AGGREGATE                 |               |     1 |    46 |            |          |
|*  7 |   HASH JOIN OUTER               |               |    30 |  1380 |  1513   (1)| 00:00:19 |
|*  8 |    TABLE ACCESS BY INDEX ROWID  | 결의T       |    30 |   750 |  1427   (1)| 00:00:18 |
|*  9 |     INDEX RANGE SCAN            | 결의T_AK1   |  1811 |       |   119   (1)| 00:00:02 |
|* 10 |      TABLE ACCESS BY INDEX ROWID| 원인T       |     1 |    19 |    32   (4)| 00:00:01 |
|* 11 |       INDEX SKIP SCAN           | SYS_C00115831 |    12 |       |    23   (5)| 00:00:01 |
|* 12 |    TABLE ACCESS FULL            | 결의반납T       |    14 |   294 |    86   (3)| 00:00:02 |
|  13 |  SORT GROUP BY NOSORT           |               |     1 |    46 |     3   (0)| 00:00:01 |
|* 14 |   TABLE ACCESS BY INDEX ROWID   | 추산T       |     1 |    46 |     3   (0)| 00:00:01 |
|* 15 |    INDEX UNIQUE SCAN            | SYS_C00116410 |     1 |       |     2   (0)| 00:00:01 |

by 우리집아찌 [2017.07.24 08:44:09]

서브쿼리을 너무 많이 쓰셨네요 

인라인뷰로 풀어서 조인해 보세요


by 마농 [2017.07.24 08:51:39]

메인 테이블은 1건만 읽어오는데 비해
서브테이블은 풀스캔 또는 스킵스캔 하는 경우가 많네요?
서브테이블에 적절한 인덱스가 없는 모양입니다. 인덱스를 점검하세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입