스칼라서브쿼리는 사용하지 않는게 맞나요 0 3 915

by dkfldkfl [SQL Query] [2018.08.24 11:19:56]


스칼라 서브 쿼리는 한 레코드당 하나의 값만 리턴함(아래 쿼리 불가능(X))
select d.deptno, d.dname
     ,(select avg(sal), min(sal), max(sal) from emp where deptno = d.deptno)
from   dept d 
where  d.loc = 'CHICAGO';
|
반복적 수행 (비효율)
SQL> select /*+gather_plan_statistics*/d.deptno, d.dname
  2       ,(select avg(sal) from emp where deptno = d.deptno) avg_sal
  3       ,(select min(sal) from emp where deptno = d.deptno) min_sal
  4       ,(select max(sal) from emp where deptno = d.deptno) max_sal
  5  from   dept d 
  6  where  d.loc = 'CHICAGO';

    DEPTNO DNAME             AVG_SAL    MIN_SAL    MAX_SAL
---------- -------------- ---------- ---------- ----------
        30 SALES          1566.66667        950       2850

SQL> select * from table( dbms_xplan.display_cursor( null, null, 'ALLSTATS LAST'));

---------------------------------------------------------------------------------------
| Id  | Operation         | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
|   1 |  SORT AGGREGATE   |         |      1 |      1 |      1 |00:00:00.01 |       1 |
|*  2 |   INDEX RANGE SCAN| EMP_X01 |      1 |      5 |      6 |00:00:00.01 |       1 |
|   3 |  SORT AGGREGATE   |         |      1 |      1 |      1 |00:00:00.01 |       1 |
|*  4 |   INDEX RANGE SCAN| EMP_X01 |      1 |      5 |      6 |00:00:00.01 |       1 |
|   5 |  SORT AGGREGATE   |         |      1 |      1 |      1 |00:00:00.01 |       1 |
|*  6 |   INDEX RANGE SCAN| EMP_X01 |      1 |      5 |      6 |00:00:00.01 |       1 |
|*  7 |  TABLE ACCESS FULL| DEPT    |      1 |      1 |      1 |00:00:00.01 |       8 |
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access("DEPTNO"=:B1)
   4 - access("DEPTNO"=:B1)
   6 - access("DEPTNO"=:B1)
   7 - filter("D"."LOC"='CHICAGO')
|

 

 

이 내용에서 스칼라 서브쿼리는 확장성이 없다고 나오는것같은데요

 

무조건 조인으로 하는게 좋은건가요 (기능중에 검색기능이 있을수있습니다.)

 

데이터가 많으면 스칼라 서브쿼리가 유용할수있나요?

예를들어서 서브쿼리 테이블(가져와서 붙힐 테이블)의 컬럼이 한개일때요

 

예를들어 A 테이블에 id 가 있고 B테이블에 id 와 name 이 있을 때

 

A테이블에 B의 id에 해당하는 name 만 붙히고 싶을 때요

 

하나만 딱 붙히는거니까 조인을 하지말고 스칼라 사용하는게 속도면에서 더 좋은방법인가요?

 

 

 

 

by 열심열심 [2018.08.24 11:33:15]

마농님이 데이터가 대량일 때 서브쿼리 캐싱 효과를 볼 수 있기 때문에 유리 할 때도 있다고 하시네요. 


by 마농 [2018.08.24 12:34:30]

대부분 조인이 더 효율적이고, 상황에 따라서 서브쿼리가 유리할 때도 있죠.


by 우리집아찌 [2018.08.24 12:57:02]
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입