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 28042 게시물 읽기
No. 28042
이것좀 알려주세여......
작성자
펭귄도사(lng1982)
작성일
2006-09-25 17:46
조회수
1,585

========================고치기전 쿼리는 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절에서 오라클이 검색하는순서가 밑에 조건문부터인가요

위쪽의 조인부분부터인가요??

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

테이블의 조회 순서는 아주 속도에 영향을 미칩니다.
A(100건), B(100만건) 이고 이 두 테이블이 키값에 의해 조인이 될경우
결과는 100건이라고 가정했을때.(예시는 네스티드루프조인입니다.)
1. A=>B로 조회될경우(100+100=200번 스켄)
① A 100건 풀스켄
② B 100차례 인덱스 스켄
1. B=>A로 조회될경우(100만+100만=200만번 스켄)
① B 100만건 풀스켄
② A 100만차례 인덱스 스켄
...먼저 풀리는 테이블을 드라이빙 테이블이라고 합니다.
이 드라이빙 테이블의 범위가 적어야 유리하겠죠.

마농(manon94)님이 2006-09-25 19:12에 작성한 댓글입니다.

마농님 답변감사드리구여........아직 궁금한게 남아있는데

마농님 말씀대로라면 위에 쿼리 두개를 비교할때.......조인부분은 똑같거든요.

단지 from a , b  위치가 바뀐것뿐인데.......

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

두 테이블중 조회범위를 확실하게 줄여줄수 있는 조건절이 있다면
보통 그 테이블을 드라이빙 테이블로 설정하게 되구요.
그런것이 없다면 테이블 분석이 된 상태라면 옵티마이저가 알아서 해주겠죠.
그런것도 아니라면 룰베이스를 따르게 되는데요
FROM절의 순서가 뒤에서 부터 풀리는게 일반적입니다.
(꼭 그런것은 아닙니다. 정답은 없구요. 옵티마이져 맘대로)
FROM절의 순서대로 풀리게 하려면 힌트를 사용할 수도 있습니다.
SELECT /*+ ORDERED */
요렇게 힌트를 주시면 FROM절의 순서대로 풀리게 됩니다.

계속 설명하자면 한도 끝도 없구요.
간략하게 설명하려고 노력했으나..
내가 봐도 알아보기 힘들군요.
책을보고 공부하시는것이...(sql 튜닝관련 서적 보면 다 나옵니다.)

마농(manon94)님이 2006-09-25 19:42에 작성한 댓글입니다.

마농님 이제 조금이해한거같습니다....
감사합니다.

펭귄도사(lng1982)님이 2006-09-25 20:05에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
28046마농님..........(고수님들)
펭귄도사
2006-09-25
717
28045프로시져에러 [1]
이분희
2006-09-25
1803
28044테이블에서 중복된 것만 뽑아오는 쿼리.. [1]
kirrie
2006-09-25
2518
28042이것좀 알려주세여...... [4]
펭귄도사
2006-09-25
1585
28041alert로그에 기록된 에러입니다. [1]
박기환
2006-09-25
1316
28038windows 2003 server(32bit) + 9.2.0.1 패치파일을 구합니다. [2]
김경호
2006-09-25
1467
28037테이블 전부 드랍할수 있는 방법좀... [4]
정진성
2006-09-25
2766
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다