조회한 결과 동일한 데이터가 많다면 인라인 뷰보다는 스칼라 서브쿼리를 사용하자.
--유저의 결제 내역인 HIST 테이블에 동일한 USER_ID가 많음
SELECT B.NAME
, A.*
FROM HIST A
, USER B
WHERE A.USE_ID = B.USE_ID
AND A.CREATED_DT BETWEEN ADD_MONTHS(SYSDATE, -1) AND SYSDATE
AND B.AGE BETWEEN 20 AND 29
- 데이터베이스 정규화로 1:N 관계에서 유저 결제 내역 테이블 HIST에 USER_ID 외래키를 가지고 있다고 가정
- 특정 기간동안 결제 내역을 가져올 때 동일한 유저의 결제 내역이 조회될 수 있음
- 이런 경우.. 스칼라 서브쿼리하고 속도 비교를 해보고 적절한 쿼리를 사용하자
스칼라 서브쿼리로 조회 속도 개선
SELECT --스칼라 서브쿼리 사용
(
SELECT NAME
FROM USER
WHERE USER_ID = A.USER_ID
AND AGE BETWEEN 20 AND 29
) AS NAME
, A.*
FROM HIST A
WHERE A.CREATED_DT BETWEEN ADD_MONTHS(SYSDATE, -1) AND SYSDATE
- 스칼라 서브쿼리는 결과 값을 캐싱하기 때문에 동일한 값이 많을 수록 속도가 빨라진다.
- 하지만 다른 유저수도 많아진다면.. 스칼라 서브쿼리 특성상 로우마다 조회하는 단점이 있다. 또한 입력 값의 종류가 많아진다면 캐시 확인하는 비용이 커질 수 있다.
WITH 임시 테이블 생성(상황에 맞게 사용해야함; 아래 코드는 예시를 위해 작성)
WITH 20_USER AS (
SELECT USER_ID
, NAME
FROM USER
WHERE AGE BETWEEN 20 AND 29
)
SELECT (
SELECT NAME
FROM 20_USER
WHERE USER_ID = A.USER_ID
) AS NAME
, A.*
FROM HIST A
WHERE A.CREATED_DT BETWEEN ADD_MONTHS(SYSDATE, -1) AND SYSDATE
- WITH 구문의 임시 테이블을 여러 번 반복해서 사용한다면 성능을 높일 수 있지만, 메모리 사용을 주의해야 한다.