- SQL을 작성하는 개발자가 직접 ROWID를 제공하거나, SQL에서 ROWID를 조인 컬럼으로 이용할때
- BY USER ROWID 실행 계획은 BY ROWID 실행 계획과 동일하게 만들어진다.


SQL>

SELECT column1, column2
FROM TABLE_NAME
CONNECT BY PRIOR column2 = column3
START WITH column2 = '11111';




실행계획>

SELECT STATEMENT
    CONNECT BY (WITHOUT FILTERING)
        NESTED LOOPS
            INDEX (UNIQUE SCAN) OF 'column2_IDX'
            TABLE ACCESS (BY USER ROWID) OF 'TABLE_NAME' 
    NESTED LOOPS
        BUFFER (SORT)
            CONNECT BY PUMP
        TABLE ACCESS (BY INDEX ROWID) OF 'TABLE_NAME'
            INDEX (RANGE SCAN) OF 'column3'   



- CONNECT BY 절을 사용하면 BY USER ROWID 실행 계획이 생성될 수 있다.
- 위 SQL에서 인덱스를 통해 column2 값인 '11111'에 대한 하나의 ROWID가 추출된다. 추출된 ROWID가 CONNECT BY절로 다시 한번 제공되기 때문에 인덱스를 통해 제공된 ROWID가 아니라 이미 엑세스된 ROWID가 제공된 것이므로 BY USER ROWID 실행 계획이 생성된다.


SQL>

SELECT column1, column2
FROM TABLE_NAME
WHERE ROWID = 'AAABBBCCCAA1'



실행계획>

SELECT STATEMENT
    TABLE ACCESS (BY USER ROWID) OF 'TABLE_NAME'



- WHERE절에 ROWID값을 명시적으로 설정하면 BY USER ROWID 실행 계획이 생성된다.
- 인덱스에 엑세스하여 하나의 ROWID를 제공받은 것과 같은 실행 계획이다.



 
신고
Posted by jeonguk