쿼리문장 비교.. 0 5 1,024

by 정대림 [2007.01.24 13:56:49]


select emp.name dept.dname from emp, dept where emp.deptno=dept.deptno

select emp.name d.dname from emp, (select detpno, dname from dept) d where emp.deptno=d.deptno

 

는 결과는 같이 나오는데요..

 

어느쪽을 쓰는게 좋을까요..

 

실제 연습 db data 는 크지 않기 때문에 차이가 없는거 같은데..

 

차이가 있는건가요??

 

제가 보기에는 불러오는 컬럼의 수가 차이가 나는거 같은데요.. ;;

 

그럼 좋은 하루 되세요.

by finecomp [2007.01.24 00:00:00]
제가 보기에는 같을 것 같은데요...^^;
다만 inline view내에서 order by나 grouping등의 처리를 하면 달라질 수 있습니다.
정확한 건 역시 실행계획이나 trace 확인이겠죠?

by 김은호 [2007.01.24 00:00:00]
2번 쿼리는 많은량의 자료에서는 느려지(1번보다)는
현상이 발생합니다.

실제필드에서는 함수를 만들어서 사용을 합니다.
select emp.name, uf_dept(emp.deptno) as dname
from emp
----이경우에는 dname 자료가 없을시에도 emp를 불러러올수 있지만
님이 하신 방법에서는 불러오지 못하는 경우가 발생합니다.

by luck747 [2007.01.24 00:00:00]
제가 직접적으로 실험을 해보지는 않았지만 위 내용은 테이블의 상태에 따라 다르지 싶네요 예를 든다면 아래의 경우 select /*push_subq*/ emp ... 이런식으로 힌트를 주면 더욱 빠르게 돌릴수 있으니 달라 지긴합니다. 하지만 실험을 해봐야겠네요.

by finecomp [2007.01.24 00:00:00]
헛...함수...ㅡ.ㅡ;;
많은량의 자료에서 조인보다 함수가 빠르다고 어디에 써있죠?
dname자료가 없을 경우도 emp를 불러오려면 outer join이나 select list에 subquery를 사용하면 됩니다. 그리고 subquery로 사용하는 경우 data cache되나 함수는 일단 row수만큼 호출되어 실행됩니다.

그리고 인라인뷰 내에 가공이 있으면 실행계획이 당연히 달라지겠죠...
별도의 가공이 없다면 실행계획을 확인해야겠지만
저 정도의 쿼리라면 특별히 인라인뷰에 no_merge 등의 SQL변환을 막는 힌트를 쓰지않았다면 내부적으로 SQL이 변환되어 위의 쿼리와 같아질 것 같은데요...

만약 건수가 대량이고 dept의 대상범위가 emp에 비해 훨씬 적다면 PUSH_SUBQ로 dept를 먼저 돌리고 nested loop join으로 풀린다면 오히려 random access가 증가하여 성능저하가 발생할 수 있습니다.

제 입장에서는 모호한? 지적들이 있길래 그냥 생각나는대로 써 봤습니다.

by luck747 [2007.01.25 00:00:00]
음 함수라 제가 생각이 짧긴 햇네요 하지만 저긴 NL 자체로 풀기보다는 건수가 많다고 NL이 정답은 아닙니다. 때로는 FULL 좋을때도 있으며, HASH가 빠를때도 있습니다. 하지만 결과적으로 ROWS 수에 따라 비례하게 해당 plan을 짜야하겠지만요 ~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입