VIEW에 ROWNUM을 추가해 관련 TABLE 에 INDEX 를 사용할수 있는지요?
ohmook 수험생

답변 채택시 : 0코아

답변 1 추천 0 조회 560 2017.05.12

CREATE OR REPLACE VIEW VIEW_TEST

AS

SELECT

APPR_ID,

EMP_CODE,

ROWNUM RNUM

FROM (

SELECT

  EADT.APPR_ID,   

  OE1.EMP_CODE

FROM   

  EAP_APPROVAL_DISPLAY_TARGET EADT,

  ORG_EMPLOYEE OE1

WHERE 

  EADT.TRGT_EMP_ID = OE1.EMP_ID

UNION ALL

SELECT

  EARD.APPR_ID,   

  OE1.EMP_CODE

FROM   

  EAP_APPROVAL_READING EARD,

  ORG_EMPLOYEE OE1

WHERE 

  EARD.READ_EMP_ID = OE1.EMP_ID

) EA

;

 

위 와같은 View 가 존재 하고 있고

ORG_EMPLOYEE 의 EMP_CODE 에 Index 가 걸려 있고 다음과 같이 조회 됩니다.


SELECT * 

FROM 

VIEW_TEST

WHERE 

  EMP_CODE = 'B14040';


이때 Rownum 이 없다면 Union 된 각각이 SQL이 View Parcing 되어 Index를 제대로 타는데요

Rownum 이 추가되면  emp_code 컬럼이 Full scan 후 Filtering 되어져 버립니다.


rownum 를 대채할수 있는 방법이 있을까요?


단 ,아래같은 경우는 사용하면 안됨.

SELECT 

 ..

, ROWNUM RNUM

FROM 

VIEW_TEST

WHERE 

  EMP_CODE = 'B14040';



댓글 (0)
목록 답변등록
VIEW에 ROWNUM을 추가해 관련 TABLE 에 INDEX 를 사용할수 있는지요?
jhchoi 2017.05.15

뷰 안에 ROWNUM 을 사용하면 뷰 머징이 되지 않아 밖의 WHERE 조건이 뷰 안으로 파고들지 못합니다.


그런데 원하는 의도가 밖에서 주어진 EMP_CODE 조건을 받아서 뷰 내에서 해당하는 인덱스를

이용하고자 하는 것으로 보이는데, 그렇다면 EMP_CODE = 'B14040' 조건에 만족하는 Row를 추출하면서
ROWNUM 이 부여되어야 하므로 위에서 마지막에 언급한 뷰 밖에서 ROWNUM 을 사용한 SQL 과

다를바 없습니다.

그런데 왜 뷰 밖에서 ROWNUM 을 사용하면 안된다고 하신건지 정확한 요건을 알수가 없네요.


만약, 뷰 안에 ROWNUM 을 사용한 이유가 주어진 EMP_CODE 조건으로 추출한 Row 에 대해서가 아니라

전체 Row 에 대해 ROWNUM 을 부여하고자 한 것이라면 EMP_CODE 조건에 상관없이 전체 데이터를 모두

처리하는게 맞습니다.

댓글 (0)