스칼라 서브 쿼리는 한 레코드당 하나의 값만 리턴함(아래 쿼리 불가능(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 만 붙히고 싶을 때요
하나만 딱 붙히는거니까 조인을 하지말고 스칼라 사용하는게 속도면에서 더 좋은방법인가요?
|