database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 28029 게시물 읽기
No. 28029
이거 쿼리좀 봐주세요
작성자
펭귄도사(lng1982)
작성일
2006-09-25 09:49
조회수
1,877

========================고치기전 쿼리는 3초나 걸렸씁니다.=================

  SELECT SA4.ORDER_NO, 
      SA4.DOC_NO, SA1.AS_NO,      
      SA1.AS_KOR_NM,  
      SA1.ITEM_STATE ,
      SA1.SPEC,
         SA1.ACP_DT,  
      SA1.QTY,  
      SA1.COST,   
      SA1.BOOK_AMT,   
      SA1.SETUP_LOC,
         SA4.ORDER_DEPT_CD,
      CM1.DPT_NM_KOR,
      SA4.ORDER_EMP_NO, 
        (SELECT NM FROM SHM010 WHERE MEMBER_NO = SA4.ORDER_EMP_NO) AS ORDER_EMP_NM,
       SA4.ORDER_DT,    
      SA4.RSN,    
      SA4.REMARK,   
      SA4.EXP_DT,    
      SA4.CHG_DIV 
    FROM SAS004 SA4, SAS001 SA1, COM001 CM1,
    (SELECT COM_CD FROM COM003 WHERE COM_CD_DIV = 'SAS001' AND COM_CD <> '$' AND DUMMY_01 = '폐기') CM3
   WHERE SA4.AS_NO = SA1.AS_NO 
     AND SA4.ORDER_DEPT_CD = CM1.DPT_CD 
     AND SA4.CHG_DIV = CM3.COM_CD 
     AND NVL(SA1.MNG_DEPT_CD, ' ') LIKE ''||'%' 
     AND NVL(SA1.SETUP_LOC, ' ') LIKE ''||'%' 
     AND NVL(SA1.ACCT_CD, ' ') LIKE ''||'%' 
     AND SUBSTR(NVL(ITEM_CD,' '), 0,1) LIKE ''||'%'
     AND SUBSTR(NVL(ITEM_CD,' '), 0,3) LIKE ''||'%'
     AND NVL(SA1.ITEM_STATE, ' ') LIKE ''||'%' 
   ORDER BY SA4.AS_NO


==========================고친후의 쿼리는============================== 


SELECT SA4.ORDER_NO, 
      SA4.DOC_NO, SA1.AS_NO,      
      SA1.AS_KOR_NM,  
      SA1.ITEM_STATE ,
      SA1.SPEC,
         SA1.ACP_DT,  
      SA1.QTY,  
      SA1.COST,   
      SA1.BOOK_AMT,   
      SA1.SETUP_LOC,
         SA4.ORDER_DEPT_CD,
      CM1.DPT_NM_KOR,
      SA4.ORDER_EMP_NO, 
        (SELECT NM FROM SHM010 WHERE MEMBER_NO = SA4.ORDER_EMP_NO) AS ORDER_EMP_NM,
       SA4.ORDER_DT,    
      SA4.RSN,    
      SA4.REMARK,   
      SA4.EXP_DT,    
      SA4.CHG_DIV 
    FROM SAS001 SA1, SAS004 SA4, COM001 CM1,
    (SELECT COM_CD FROM COM003 WHERE COM_CD_DIV = 'SAS001' AND COM_CD <> '$' AND DUMMY_01 = '폐기') CM3
   WHERE SA4.AS_NO = SA1.AS_NO 
     AND SA4.ORDER_DEPT_CD = CM1.DPT_CD 
     AND SA4.CHG_DIV = CM3.COM_CD 
     AND NVL(SA1.MNG_DEPT_CD, ' ') LIKE ''||'%' 
     AND NVL(SA1.SETUP_LOC, ' ') LIKE ''||'%' 
     AND NVL(SA1.ACCT_CD, ' ') LIKE ''||'%' 
     AND SUBSTR(NVL(ITEM_CD,' '), 0,1) LIKE ''||'%'
     AND SUBSTR(NVL(ITEM_CD,' '), 0,3) LIKE ''||'%'
     AND NVL(SA1.ITEM_STATE, ' ') LIKE ''||'%' 
   ORDER BY SA4.AS_NO

바로 나왔는데 여기서 의문은  고친게 단지 FROM 절의 SAS001 과 SAS004
위치만 바꾼거거든요!! 
어째서 속도차이가 엄청난거져?? 밑에있는 쿼리는 바로나왔씁니다.
위에껀 3초나 걸리고~~ 
(SAS001은 9만건있고 SAS004 는 1건있습니다. COM001은 800건있고요)
그리고 WHERE절에서 오라클이 검색하는순서가 밑에 조건문부터인가요
위쪽의 조인부분부터인가요??

이 글에 대한 댓글이 총 3건 있습니다.

음 쿼리 plan을 보면 알겠지만...


plan은 같을거 같습니니다.


그런데 속도가 빠른것은 아마

Buffer Cache되어서 그런것일 겁니다.


즉 위에 sql을 돌리면서 해당되는 db block가 

memory에 cache가 됩니다.


그리고 바로 밑에 sql 문장을 수행하면

데이타를 db_block(HDD)에서 읽지 않고

메모리 cache에서 읽게 됩니다.


김충관(kcg1932)님이 2006-09-25 16:21에 작성한 댓글입니다.

답변감사드리지만.....

그것때문은 아닌것같습니다........

제가 여러번해봤는데 위에껀 3초계속 걸리고 아래껀.......금방나오니깐여.

흠.

펭귄도사(lng1982)님이 2006-09-25 17:05에 작성한 댓글입니다.

1. 두개의 실행계획을 확인하는게 좋을것 같습니다.

2. 오라클이 검색하는순서가 밑에 조건문부터인가요
위쪽의 조인부분부터인가요??

옵티마이져 모드에 따라서 달라질 수 있다라는 문건 또는 현상은 있습니다만, 그것은 옵티마이져가 두개가 동일한 COST 가 구해졌을 때일 것 같습니다.

제 기억에 RULE 은 뒤에서 COST는 앞에서 라고 기억되는데 가물가물 하네요.

그전에 먼저, 1번 두개의 실행계획의 차이를 확인하는 것이 중요할 듯 합니다.

김대훈님이 2006-09-26 12:01에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
28033조인에서..
펭귄도사
2006-09-25
1031
28032토드 한글메뉴얼 구할수있을까요?? [6]
펭귄도사
2006-09-25
3068
28031오라클 프로세스가 줄지를 않습니다.. -_- [1]
우정민
2006-09-25
1772
28029이거 쿼리좀 봐주세요 [3]
펭귄도사
2006-09-25
1877
28028토드에서 autocommit 설정 [1]
펭귄도사
2006-09-24
11094
28027이럴수가있는건가요? ORA-03113 에러 [3]
궁금해요
2006-09-24
3013
28026오라클 한글 깨짐
황정식
2006-09-23
2871
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다