• VIEW PUSHED PREDICATE 原理


    <pre name="code" class="sql">SELECT *
    FROM (SELECT DISTINCT e.n_event_id,
    e.n_parent_id,
    e.v_event_num,
    em.n_req_type_1,
    em.n_req_type_2,
    em.v_title,
    em.v_description,
    e.n_priority,
    cb.n_time_limit,
    cb.n_status,
    e.n_process_way,
    e.n_maintaince_event_id,
    e.v_maintaince_flag,
    e.v_replacedevice_flag,
    et.d_acbept_date,
    et.d_finish_date,
    et.v_exempt_status,
    et.n_callback_status,
    et.n_delay_time,
    erpl.n_creator,
    erpl.d_creation_date,
    e.n_req_id,
    el.v_res_notice_msg,
    el.v_res_notice_email,
    el.v_res_notice_im,
    vd.v_valid_status,
    vd.v_related_org_id,
    e.n_dev_process_way,
    e.v_over_time_reason,
    e.v_confirm_person,
    e.v_new_device_num
    FROM tb_event e,
    tb_event_related_person erpl,
    vorg_department vd,
    tb_callback cb,
    tb_event_log el,
    tb_event_marker em,
    tb_event_track et
    WHERE e.n_event_id = et.n_event_id(+)
    AND e.n_event_id = em.n_event_id(+)
    AND e.n_event_id = el.n_event_id(+)
    AND e.n_event_id = cb.n_event_id(+)
    AND erpl.n_dept_id = vd.recid(+)
    AND e.n_event_id = erpl.n_event_id(+)
    ORDER BY e.d_creation_date DESC)
    WHERE rownum <= 40;
    
    vorg_department为一个view,具体定义如下:
    
    create or replace view vorg_department as
    select d.recid,
    r.v_valid_status,
    d.v_related_org_id,
    r.org_parent,
    r.tree_no,
    d.dept_kind,
    d.dept_type,
    d.dept_name,
    d.status,
    d.dept_code,
    d.area_code,
    d.dept_prof,
    d.sort_num,
    d.link_addr,
    r.layer
    from ORG_DEPARTMENT d, ORG_DEPRELATION r
    where d.recid = r.org_child
    and r.relation_type = 1
    
    
        该语句的执行计划如下:
    
    PLAN_TABLE_OUTPUT
    
    ———————————————————————————————————–
    | Id  | Operation                     |  Name                 | Rows  | Bytes|TempSpc|Cost|
    ———————————————————————————————————–
    |   0 | SELECT STATEMENT              |                       |     40| 15404|    |  23M|
    |*  1 |  COUNT STOPKEY                |                       |       |      |    |     |
    |   2 |   VIEW                        |                       |   110M|  395G|    |  23M|
    |*  3 |    SORT UNIQUE STOPKEY        |                       |   110M|   27G| 58G|  11M|
    |   4 |     NESTED LOOPS OUTER        |                       |   110M|   27G|    | 2797|
    |*  5 |      HASH JOIN OUTER          |                       |  1255K|  308M| 39M| 2797|
    |*  6 |       HASH JOIN OUTER         |                       |   153K|   37M| 28M| 1873|
    |*  7 |        HASH JOIN OUTER        |                       |   115K|   27M| 24M| 1384|
    |*  8 |         HASH JOIN OUTER       |                       |   101K|   23M| 23M|  990|
    |*  9 |          HASH JOIN OUTER      |                       |   100K|   22M| 17M|  571|
    |  10 |           TABLE ACCESS FULL   | TB_EVENT              |  77044|   16M|    |  256|
    |  11 |           INDEX FAST FULL SCAN| IDX_EVENT_TRACK_N_E_ID|   100K|  491K|    |    4|
    |  12 |          INDEX FAST FULL SCAN |IDX_TB_CALLBAK_E_ID    |  75959|  296K|    |   21|
    |  13 |         TABLE ACCESS FULL     | TB_EVENT_MARKER       |   3686| 18430|    |    3|
    |* 14 |        INDEX FAST FULL SCAN   | IDX_TB_EVENT_RP_DUP1  |   101K|  895K|    |    4|
    |  15 |       INDEX FAST FULL SCAN    |IDX_TB_EVENT_LOG_N_E_ID|   628K| 2455K|    |  149|
    |  16 |      VIEW PUSHED PREDICATE    | VORG_DEPARTMENT       |     88| 1144 |    |     |
    |  17 |       NESTED LOOPS            |                       |     1 |   15 |    |    2|
    |* 18 |        INDEX UNIQUE SCAN    | PK_DEPARTMENT           |     1 |     6|    |    1|
    |* 19 |        INDEX RANGE SCAN     | ASSOCIATION8_FK         |     1 |     9|    |    1|
    
    ———————————————————————————————————–
    
    
    
    这里 tb_event_related_person erpl和 vorg_department vd 关联
    AND erpl.n_dept_id = vd.recid(+)
    
    
    create or replace view vorg_department as
    
    select d.recid,
    r.v_valid_status,
    d.v_related_org_id,
    r.org_parent,
    r.tree_no,
    d.dept_kind,
    d.dept_type,
    d.dept_name,
    d.status,
    d.dept_code,
    d.area_code,
    d.dept_prof,
    d.sort_num,
    d.link_addr,
    r.layer
    from ORG_DEPARTMENT d, ORG_DEPRELATION r
    where d.recid = r.org_child
    and r.relation_type = 1
    
    
    
    谓词推入通过关联列推入,这里把erpl.n_dept_id 推入到vd.recid
    
    对试图通过vd.recid列进行提前过滤
    
    相当于对视图的数据进行提前过滤,谓词推入的主要目的就是让Oracle尽可能早的过滤掉无用的数据,从而提升查询性能。


    
                                        
    
  • 相关阅读:
    NoSQL 数据库中的 CAP 理论
    JVM 相关概念
    Servlet 生命周期
    RabbitMQ
    消息队列概述
    05.类加载器深入解析及重要特性剖析
    LINUX笔记3(用户管理)
    LINUX笔记2(创建和编辑文本)
    修改httpd端口后,服务不能启动。
    LINUX笔记1(命令行和目录结构)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13352079.html
Copyright © 2020-2023  润新知