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 29631 게시물 읽기
No. 29631
이 두개의 쿼리의 차이점 좀 알려주세요?
작성자
나그네
작성일
2007-02-02 09:10
조회수
3,546

1.   SELECT A.EMPNO, B.DEPTNO
      FROM EMP A, DEPT B
      WHERE A.DEPTNO = B.DEPTNO
      AND A.DEPTNO IN (10,20);

2.   SELECT A.EMPNO, B.DEPTNO
     FROM EMP A, DEPT B
     WHERE A.DEPTNO = B.DEPTNO
     AND B.DEPTNO IN (10,20);

저 위 두개의 쿼리의 차이점이 궁금합니다.

실행계획으로 확인했지만 똑같긴 했지만

속도차이나 이런거요^^

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

B.DEPTNO


A.DEPTNO


이부분만 틀리네요 


emp 보다는 dept 가 로우수가 적을것같습니다.


그래서 b.deptno 로 하면 더 빠를겁니다.   <-- 수정 ㅡㅡ;; b.deptno


전체 로우수 차이일겁니다.



A 테이블이 100개사용자  B테이블 10개부서


이면......


100개중에 부서가 '10','20' 을 찾는것보다..  100번비교 실은 in을 써서 200번비교


10개부서중에 '10','20' 을 찾는게 더 빠를겁니다. 10번비교, 20번비교.


두개 숫자차이가 크면클수로 속도도 더 차이나겠죠 아마도 ^^;;

미르원님이 2007-02-02 14:31에 작성한 댓글입니다.
이 댓글은 2007-02-02 15:03에 마지막으로 수정되었습니다. Edit

답변 감사합니다

그런데 잘 이해가 안 간게 있어서요^^

emp a, dept b 에서 b.deptno보다 a.deptno로 where절로 해야 왜 빠른지

잘 이해가 되지 않습니다

죄송하지만 한번 더 설명해주시면 안 되겠습니까

나그네님이 2007-02-02 14:52에 작성한 댓글입니다. Edit

Optimzer Mode가 CBO일때는 이행성 규칙(Transitivity Principle)으로 인해 둘은 같은 sql로 인식됩니다.

백면서생(laalaal)님이 2007-02-02 15:41에 작성한 댓글입니다.

네 감사합니다

용어가 좀 어렵네요

검색해서 이 용어에 대해 찾아봤지만 확 와닿지가 않네요

조금 더 쉽게 설명 좀 부탁드립니다^^

나그네님이 2007-02-02 16:09에 작성한 댓글입니다.
이 댓글은 2007-02-02 16:10에 마지막으로 수정되었습니다. Edit

안녕하세요. 제가 답변을 드려봅니다.
일반적으로 조인을 할 때, 예를들어 A와 B를 조인할 때 크기가 작은 쪽에서 큰 쪽으로 데이터가 흘러가는게 빠릅니다.

예를들어 보겠습니다.

<테이블 EMP>

NO EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
1 7369 SMITH CLERK 7902 1980-12-17 800   20
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
4 7566 JONES MANAGER 7839 1981-04-02 2975   20
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
6 7698 BLAKE MANAGER 7839 1981-05-01 2850   30
7 7782 CLARK MANAGER 7839 1981-06-09 2450   10
8 7788 SCOTT ANALYST 7566 1982-12-09 3000   20
9 7839 KING PRESIDENT   1981-11-17 5000   10
10 7844 TURNER SALESMAN 7698 1981-09-08 1500.1 0 30
11 7876 ADAMS CLERK 7788 1983-01-12 1100   20
12 7900 JAMES CLERK 7698 1981-12-03 950   30
13 7902 FORD ANALYST 7566 1981-12-03 30001   20
14 7934 MILLER CLERK 7782 1982-01-23 1300   10


<테이블 DEPT>
NO DEPTNO DNAME LOC
1 10 ACCOUNTING NEW YORK
2 20 RESEARCH DALLAS
3 30 SALES CHICAGO
4 40 OPERATIONS BOSTON


위에 2개의 테이블이 있는데 나그네님께서 말씀하신 첫번째 쿼리를 보겠습니다.

SELECT A.EMPNO,
             B.DEPTNO
FROM   EMP  A,
            DEPT B
WHERE  A.DEPTNO = B.DEPTNO
AND       A.DEPTNO IN (10, 20);

여기서 보시면 A.DEPTNO IN (10, 20) 으로 인해 A 테이블이 먼저 상수를 받습니다. 그리고 상수화된 DEPTNO를 DEPT 테이블에 넘겨주죠(조인)
이 과정을 일반적으로 A 테이블이 드라이빙 걸렸다고 하는데요. 이 쿼리가 처리하는 전체 로우수를 보겠습니다.

참고로 여기서 말씀드리는 로직은 Full Scan을 기준으로 설명드립니다.(Full Scan은 인덱스 없이 테이블 전체를 뒤져보는 로직입니다.)

/*********************************************************************/
/* 1. 첫번째 쿼리 분석                                                                         */
/*********************************************************************/
A.DEPTNO IN (10, 20) 를 통해 EMP 테이블에 (10, 20)인 데이터를 찾습니다. 그럼 EMP 테이블이 총 14 로우수이기 떄문에 전체를 다 뒤지므로 14가 됩니다. --- ①
그리고 (10)을 찾아봤더니 3개 로우가 검색되었습니다. --- ②
이 3개의 로우를 가지고 A.DEPTNO = B.DEPTNO 이 과정을 통해 DEPT 테이블에 (10)이 있는지 찾아봐야겠죠? 만족하는 로우는 1개 이지만 전체를 다 뒤져야 되므로 4번을 찾습니다. --- ③

그리고 (20)에 대해서도 마찬가지로 ②, ③ 번 과정을 거쳤더니 5번, 4번이 나왔습니다.

이를 토대로 (10, 20)에 대해 만족하는 로우를 찾기위해 검색한 총 로우수는 14 + (3 * 4) + (5 * 4) = 46 이 됩니다.


/*********************************************************************/
/* 2. 두번째 쿼리 분석                                                                         */
/*********************************************************************/
이제 두번째를 보도록 하겠습니다.

SELECT A.EMPNO,
       B.DEPTNO
FROM   EMP  A,
       DEPT B
WHERE  A.DEPTNO = B.DEPTNO
AND    B.DEPTNO IN (10, 20);


두번째는 EMP부터 상수를 받는게 아니라 B.DEPTNO IN (10, 20) 이것처럼 DEPT부터 상수를 받았네요. 이를 통해 1번에서 했던 과정을 반복해보면 다음과 같은 값이 나옵니다.

DEPT에서 (10, 20)을 찾기 위해 검색한 총 로우수 : 4
(10)을 가지고 EMP에서 찾기 위해 검색한 총 로우수 : 1 * 14
(20)을 가지고 EMP에서 찾기 위해 검색한 총 로우수 : 1 * 14

-> 4 + (1 * 14) + (1 * 14) = 32 이 됩니다.




여기서 보셨다시피 상수로 받는 테이블(드라이빙 테이블)이 조회조건에 의해 만들어진 집합 결과가 작은 쪽이 더 유리하다는 것을 알 수 있을 것입니다.
현재는 EMP와 DEPT테이블에 데이터가 얼마 없어서 첫번째 쿼리와 두번째 쿼리의 응답속도 차이를 별로 못 느끼실테지만 100만건만 넘어가도 확연한 차이를 느끼실 수 있을겁니다.
더 자세한 내용을 원하시면 '새로쓴 대용량 데이터베이스 솔루션' 책을 사셔서 공부하시면 될 것 같습니다.


강정식(raxsoft)님이 2007-02-02 17:44에 작성한 댓글입니다.
이 댓글은 2007-02-02 17:51에 마지막으로 수정되었습니다.

미르원님과 강정식님 답변 너무 감사합니다.

캐감동먹었습니다.

미르원님 다시 재수정해서 답변해주신거 고맙구요

강정식님의 명강의 넘 잘 보았습니다.

나그네님이 2007-02-02 18:15에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
29634rownum을 이용한 sorting에 대한 질문 [3]
서찬
2007-02-02
1451
29633[질문]리턴된 값을 XML형식으로 뿌려줄려면? [1]
류호태
2007-02-02
1949
29632pc 컴파일시 에러 확인 부탁 드립니다. [1]
돌풍
2007-02-02
1189
29631이 두개의 쿼리의 차이점 좀 알려주세요? [6]
나그네
2007-02-02
3546
29630START WITH 계층형 질의 구조에서 삭제 방법.. [2]
궁금이
2007-02-02
2258
29629ORA 12514 TNS 리스너가 현재 접속 기술자에 요청된 서비스를 알지 못함 [1]
윤승호
2007-02-01
2664
29628날짜관련 질문입니다.
궁금
2007-02-01
1178
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.096초, 이곳 서비스는
	PostgreSQL v13.3으로 자료를 관리합니다