메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Oracle (토론 | 기여)님의 2025년 8월 25일 (월) 10:53 판 (새 문서: == XPLAN에서 View Pushed Predicate 항목 == * `VIEW PUSHED PREDICATE`는 Oracle 옵티마이저가 뷰(View)의 성능을 최적화하기 위해 필터 조건을 뷰 내부로 밀어 넣는(push down) 실행 계획을 나타냅니다. * 이 최적화 기법은 뷰의 기본 테이블에서 더 적은 데이터를 읽게 만들어 I/O를 줄이고 쿼리 성능을 크게 향상시킵니다. === VIEW PUSHED PREDICATE 원리 === # 일반적인 VIEW Merge 처리 실행 순서 #...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

XPLAN에서 View Pushed Predicate 항목

  • `VIEW PUSHED PREDICATE`는 Oracle 옵티마이저가 뷰(View)의 성능을 최적화하기 위해 필터 조건을 뷰 내부로 밀어 넣는(push down) 실행 계획을 나타냅니다.
  • 이 최적화 기법은 뷰의 기본 테이블에서 더 적은 데이터를 읽게 만들어 I/O를 줄이고 쿼리 성능을 크게 향상시킵니다.

VIEW PUSHED PREDICATE 원리

  1. 일반적인 VIEW Merge 처리 실행 순서
    1. 뷰 실행 : 뷰가 정의된 SQL을 실행하여 가상 테이블(virtual table) 생성.
    2. 필터 적용 : 그 결과에 쿼리의 `WHERE` 절 조건을 적용하여 최종 결과 반영
  2. `VIEW PUSHED PREDICATE` 처리 실행 순서
    1. 필터 푸시 다운 : 쿼리의 `WHERE` 절에 있는 조건이 뷰의 SQL 내부로 PUSH 되어 먼저 실행.
    2. 뷰 실행: PUSH된 조건에 따라 뷰의 기본 테이블에서 필요한 데이터만 필터링 처리.

VIEW PUSH DOWN 효율성 예시

  • 예를 들어, 100만 건의 데이터를 가진 테이블로 만든 뷰가 있고, 사용자는 그중 100건만 필요로 하는 쿼리를 실행한다고 가정
  1. 푸시 다운이 없는 경우: 100만 건 전체를 뷰에서 읽어온 후, `WHERE` 절을 적용해 100건을 필터링합니다. 이는 매우 비효율적
  2. 푸시 다운이 있는 경우: `WHERE` 절 조건이 뷰 내부로 들어가 100만 건 중 처음부터 100건만 읽게 됩니다. 결과적으로 I/O와 CPU 사용량이 획기적으로 줄어듭니다.

XPLAN에서의 표기

  • `EXPLAIN PLAN` 또는 `DBMS_XPLAN.DISPLAY_AWR` 등으로 생성한 실행 계획에서 `VIEW PUSHED PREDICATE`는 `PLAN` 테이블의 `Predicate Information` 섹션에서 확인
Plan hash value: 3968600508

---------------------------------------------------------------------------------
| Id  | Operation                     | Name            | E-Rows | A-Rows | Buffers |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                 |      1 |      1 |      10 |
======> 여기 
|* 1 |  VIEW PUSHED PREDICATE        | MY_VIEW         |      1 |      1 |      10 |
|* 2 |   TABLE ACCESS FULL           | EMPLOYEES       |      1 |      1 |      10 |
---------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("EMP_ID"=100)
       
   2 - filter("EMP_ID"=100)
  • 설명
    • 1 - `filter("EMP_ID"=100)`**: `VIEW PUSHED PREDICATE` 작업(`Id 1`)에 필터 조건 `EMP_ID = 100`이 적용되었습니다.
    • 2 - `filter("EMP_ID"=100)`**: 이 필터 조건이 내부적으로 `TABLE ACCESS FULL`(`Id 2`) 작업, 즉 실제 테이블 스캔 작업으로 푸시(push)되었음을 보여줍니다.