조회한 결과 동일한 데이터가 많다면 인라인 뷰보다는 스칼라 서브쿼리를 사용하자.
--유저의 결제 내역인 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 구문의 임시 테이블을 여러 번 반복해서 사용한다면 성능을 높일 수 있지만, 메모리 사용을 주의해야 한다.
foreach는 return; 으로 순회를 빠져나올 수 없다.
var arr = [];
arr.foreach(function(c) {
    if(c.use = "Y") {
    	//cant not break;
    	return;
    }
});
  • 강제로 예외를 던져서 나올 수 있지만... some을 사용하자

 

some을 사용하면 순회를 빠져나올 수 있다.
var arr = [];
arr.some(function(c) {	
    //true를 반환하면서 순회를 빠져나올 수 있다.
    if(c.use == "Y") {
    	return true;
    }
    
    //모든 요소를 순회하면 false를 반환한다.
});
비교할 데이터를 조회한 값이 NULL이면 MERGE구문이 실행되지 않는다.
MERGE INTO TABLE A
USING (
    SELECT *
    FROM TABLE
    WHERE CON1 = 'Y'
) B --NULL
ON (A.SEQ = B.SEQ)
--NOT EXECUTE
WHEN MATHCHED THEN
    UPDATE SET
    	UPDATE_DT = SYSDATE
WHEN NOT MATCHED THEN
    INSERT (
    	INSERT_DT
    ) 
    VALUES (
    	SYSDATE
    )

 

  • WHEN NOT MATCHED THEN에 CATCH되지 않는다.
  • ON 조건절에 사용한 컬럼을 업데이트하면 오류가 발생한다.

+ Recent posts