DATOR


/*+ bypass_ujvc */에 대한 대안 SQL가이드


/*+bypass_ujvc*/ 는 오라클 공식 힌트가 아니므로 기본적으로 사용을 자제 하는것이 맞다고 생각된다.

bypass사용시 에러에 대한 대안을 살펴보자

그동안 편하다는(?)이유로 많이들 bypass 를 사용하였을 것이다.

하지만 11g부터는 "어라~~~??? 왜 안되지?" 당혹스러우셨을 수도 있을거라 생각된다.

 

11g에서는 /*+bypass_ujvc*/  사용시 RA-01779발생한다.

 

1. 딕셔너리에 인덱스가 존재하는 것처럼

예제)

 CREATE UNIQUE INDEX AAA_V01_UK ON AAA_V01 

OBJ_ID 
)
UNUSABLE;

-> UNIQUE한 인덱스가 존재한다는 정보를 옵티마이저에게 줌으로써 키보존 테이블 이라는 정보를 제공

 

실제 인덱스를 생성하지 않고 단지 인덱스가 존재하는 것처럼 보이게 하는 것이다.

이러한 bypass보다는 11g에서는 MERGE문을 활용하는 것이 더 효율적이라고 생각된다.

 

2. Oracle 11g 이후 Merge 방법 사용

예제)

2.png

 

※ MERGE문 소개

 

- INSERT와  UPDATE를 한번에…
- 9i 이후 부터

 

MERGE
INTO
(Insert 나 update 할) 타겟 테이블
USING
 타켓 테이블에 들어갈 소스 데이터  즉,  조인조건
ON
인서트 할 것인지 업데이트 할것인지를 결정하는 조건 즉 , 조건이 맞으면 업데이트문 실행
조건이 맞지 않으면 인서트 문을 실행한다.
WHEN MATCHED THEN  
조건이 맞았을 때 쿼리문
WHEN NOT MATCHED THEN 
조건이 맞지 않았을 때 쿼리문


예문)  

MERGE INTO
bonuses D
USING   (SELECT employee_id, salary, department_id
            FROM   employees

            WHERE department_id = 80) S

ON       (D.employee_id = S.employee_id)

WHEN MATCHED THEN
UPDATE  SET D.bonus = D.bonus + S.salary*.01

WHEN NOT MATCHED THEN
INSERT  (D.employee_id, D.bonus)

VALUES (S.employee_id, S.salary*0.1);

 

 

Tag :

Leave Comments