Select List절에 사용한 한 개 레코드 로부터 한 개 컬럼 값만을 반환하는 Subquery를 말한다.
· Select List Scalar Subquery를 수행할 결과집합이 대량이 아닌 경우
· 코드성 테이블의 조인이 많아 실행계획이 복잡해져 제어가 어려운 경우
· 코드성 테이블에서 명칭만 가져오는 경우 (단, 코드에서 명칭만 가져오더라도 결과 집합이 대량이면 스칼라 서브쿼리가 불리할 수 있으므로 대량인 경우 조인을 사용할 것)
· 한 개의 테이블에서 복수 개의 컬럼을 가져오는 경우 스칼라 서브쿼리(두개의 컬럼을 ||로 묶어서 한 개의 컬럼을 리턴)를 사용하지 말고 조인을 사용하도록 함
아래 사용 예를 기술 하였으며 소량의 데이터인 경우는 Select List Scalar Subquery > Nested Loop Join > User Function (Java Stored Function ) 순으로 Select List Scalar Subquery 가 제일 효율적이므로 반드시 명칭을 가져오는 경우와 같은 단순한 곳에 사용해야 성능을 보장할 수 있음.
SELECT a.name
, a.content
, ( SELECT code_nm FROM code_t code WHERE code.codeid = a.bbsid ) bbs_nm
FROM BBS
WHERE bbsid = 1
사례2 . 조인에 참여 하는 테이블이 많아 실행 계획 제어가 어려운 경우
또는 코드성 테이블에서 명칭만을 가져오기 위해 메인집합과 조인하는 경우, 조인해야될 테이블이 많고 또 쿼리가 복잡할수록 원래 의도했던 실행계획으로 풀리지 않는 경우 Select List Scalar Subquery를 활용하여 실행계획을 단순화 시키고자 할 때 사용 한다.
SELECT col1, col2,
( SELECT cd_nm FROM code WHERE cd = tab1.cd )
FROM TAB1, TAB2, TAB3
사례3 . 단순히 count, sum등의 간단한 집계 작업인 경우
SELECT
( SELECT count(*) FROM sum WHERE sum.cd = tab.cd )
FROM TAB
아래 SQL은 어떤것을 사용하든지 접근하는 PAGE 수는 동일하나, 인별로 제안건수가 10만건씩이라고 가정하면
예1 설명 - 사원10명의 데이터를 읽게 되면 총 100만건의 조인된 집합이 생성된후 group by를 통해서 count를 실행하게됨
예2 설명 - 스칼라 서브쿼리를 사용한 경우 예1)과 같은 조인연산이 필요없고 조인된 집합을 가져가는 부하가 없어지게 된다. 이러한 경우도 Scalar Subquery가 유리한 경우이다. 조인을 한 다음 group by 하는것을 필요한 데이터를 group by로 읽은후 조인함으로써 조인 횟수를 줄이도록 튜닝하는 경우와 비슷하다고 생각하면 된다.
조인을 한다음에 group by를 하는경우
SELECT a.사번, a.성명, a.주민번호, a.자택전화번호, a.EMAIL, COUNT(*)
FROM 사원 a, 제안 b
WHERE a.현소속조직 = 'D1007'
AND b.제안출처구분 = '사원'
AND b.제안출처 = a.사번
GROUP BY 사번, 성명, 주민번호, 자택전화번호, EMAIL
별도의 조인없이 원하는 count만을 구하는 경우
SELECT 사번, 성명, 주민번호, 자택전화번호, EMAIL,
(SELECT COUNT(*)
FROM 제안 b
WHERE b.제안출처구분 = '사원'
AND b.제안출처 = a.사번
) 제안횟수
FROM 사원 a
WHERE 현소속조직 = 'D1007'