같은 테이블 내부 쿼리 문제 0 12 963

by 감자마늘 [SQL Query] 내부쿼리 [2015.07.27 15:55:36]


안녕하세요.

같은 테이블을 내부 쿼리에 사용하는데 조회 시간이 오래 걸려서 

혹시 다른 방법이 없을까 하고 질문 올립니다.

 

SELECT a.code, a.description,

                                    (SELECT count(b.code)

                                      FROM TEST b

                                    WHERE b.rec_date >to_char(add_months('20150727',-6),'yyyymmdd')  

                                        AND b.description = a.description

                                    ) date1

FROM TEST a

WHERE a.reg_date = '20150727'

 

리스트는 a.reg_date가 20150727인 code와 description와 최근 6개월간 description이 같은 데이터 개수

이렇게 알고 싶은데...

 

시간이 꽤 걸리다 보니..

혹시 다른 방법이 있는지 궁금합니다..

 

 

by 겸댕2후니 [2015.07.27 16:09:28]

실행계획 같이 올려주세요~


by 감자마늘 [2015.07.27 16:15:47]

실행계획이 어떤건가요??


by 겸댕2후니 [2015.07.27 16:20:07]

...음... 쓰고있는 툴이 어떤건가요?


by 감자마늘 [2015.07.27 16:22:57]

토드 쓰고 있습니다.


by 겸댕2후니 [2015.07.27 16:25:21]

현재 PC에 설치되있지않아 확인해드릴수가없네요.

토드 실행계획확인하는 법 찾아서 확인 하신 후, 실행계획을 올려주셔야

조언을 드릴 수 있습니다.


by 감자마늘 [2015.07.27 16:27:35]

네~! 실행계획이란거 몰라서 이게 뭔가 했는데 방금 검색해서 알게 되었습니다..!
올려보고 답변 달겠습니다.

감사합니다.


by 감자마늘 [2015.07.27 16:54:56]

실행계획과 쿼리 남겼습니다 겸댕후니님


by 감자마늘 [2015.07.27 16:53:04]

아래 형식으로 뽑아서 드리면 되는건가요??확인부탁드릴게요 ! ㅜ

<ExplainPlan>
  <PlanElement id="0" operation="SELECT STATEMENT" optimizer="ALL_ROWS" cost="3,302" cardinality="263" bytes="4,734" cpu_cost="163,784,412" io_cost="3,292" time="40">
    <PlanElements>
      <PlanElement id="1" operation="SORT" option="AGGREGATE" cardinality="1" bytes="13">
        <PlanElements>
          <PlanElement object_ID="0" id="2" operation="TABLE ACCESS" option="FULL" optimizer="ANALYZED" object_owner="AAAAA" object_name="T2WORK_ORDER" object_type="TABLE" object_instance="1" cost="3,307" cardinality="65" bytes="845" cpu_cost="233,356,795" io_cost="3,292" filter_predicates="&quot;EQ_POSITION&quot;=:B1 AND &quot;REC_DATE&quot;&gt;=TO_CHAR(ADD_MONTHS('20150721',(-6)),'yyyymmdd')" time="40"/>
        </PlanElements>
      </PlanElement>
      <PlanElement object_ID="0" id="3" operation="TABLE ACCESS" option="FULL" optimizer="ANALYZED" object_owner="AAAAA" object_name="T2WORK_ORDER" object_type="TABLE" object_instance="2" cost="3,302" cardinality="263" bytes="4,734" cpu_cost="163,784,412" io_cost="3,292" filter_predicates="&quot;X&quot;.&quot;REC_DATE&quot;='20150721'" time="40"/>
    </PlanElements>
  </PlanElement>
</ExplainPlan>

 


by 감자마늘 [2015.07.27 16:54:34]

이건 쿼리에요

SELECT   wo_no                                          
                ,(SELECT count(wo_no)                                                    
                    FROM T2WORK_ORDER                                                
                   WHERE rec_date>=to_char(add_months('20150721',-6),'yyyymmdd')
                    AND  eq_position = x.eq_position) Position                
        FROM T2WORK_ORDER x                                                            
        WHERE x.rec_date = '20150721'         


by 겸댕2후니 [2015.07.27 17:23:26]

이렇게 올려주시면 확인이 불가합니다....

현재 토드가 없으니, sqlplus로 설명드릴게요.

1. 접속 : sqlplus ID/PASSWORD@SID

2. 플랜뜨기 : set autot traceonly exp

3. 플랜확인

 

 

ex )

C:\Users\LDCC>sqlplus test/test@event

SQL*Plus: Release 11.2.0.4.0 Production on 월 7월 27 17:22:27 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


다음에 접속됨:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.7.0 - Production

SQL> set autot traceonly exp
SQL> select * from dual;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'DUAL'

 

SQL>


by 이재현 [2015.07.27 18:36:52]

대충 플랜 비슷한거 보니 스칼라 서브 쿼리가 FTS으로 타는것 같습니다.

우선 같은 테이블이잖아요?
 

SELECT a.code, a.description, COUNT( CASE b.rec_date > to_char(add_months('20150727',-6),'yyyymmdd') WHEN b.code END ) AS date1
  FROM TEST a
WHERE a.reg_date = '20150727'
GROUP BY a.code, A.description

 대충 이런식으로 하면 될듯하네요.


by 마농 [2015.07.28 08:36:28]
SELECT code, description
     , COUNT(*) date1
  FROM test
 WHERE rec_date <= '20150727'
   AND rec_date > TO_CHAR(ADD_MONTHS('20150727', -6), 'yyyymmdd')
 GROUP BY code, description
 HAVING MAX(rec_date) = '20150727'
;

 

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