• 执行计划实验


    1、在本地创建本地命名,连接到讲师机数据。

    在 e:appadministratorproduct11.2.0dbhome_1 etwordadmin nsnames.ora

    文件中加入以下内容

    test =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.11.209)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = orcl)
        )
      )


    用sqlplus 测试是否可以连接

    sqlplus test/test@test

    连接到:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    With the Partitioning, Automatic Storage Management, OLAP, Data Mining
    and Real Application Testing options

    SQL>

    2、用test/test 用户登录PL/SQL Developer

    打开一个SQL窗口

    delete from plan_table;
    commit;

    explain plan for

    SELECT
    c2.order_num,c2.customer_id, c2.create_date, c1.product_spec
    FROM product c1, order_mat c2, order_detl c3
     where c3.order_id=c2.order_id and c1.product_id=c3.product_id and
     c1.product_spec='QSP3N4'and c2.create_date between
      to_date('2009-01-01','yyyy-mm-dd') and to_date('2009-12-01','yyyy-mm-dd');

    SELECT * FROM table(DBMS_XPLAN.DISPLAY);

    看相关的执行计划,发现有大量的全部扫描和hash jion
    Plan hash value: 3203830265
     
    --------------------------------------------------------------------------------------------
    | Id  | Operation                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |             |    18 |  1314 | 49435   (1)| 00:09:54 |
    |   1 |  NESTED LOOPS                |             |       |       |            |          |
    |   2 |   NESTED LOOPS               |             |    18 |  1314 | 49435   (1)| 00:09:54 |
    |*  3 |    HASH JOIN                 |             |   122 |  4026 | 49191   (1)| 00:09:51 |
    |*  4 |     TABLE ACCESS FULL        | PRODUCT     |     1 |    20 |   694   (1)| 00:00:09 |
    |   5 |     TABLE ACCESS FULL        | ORDER_DETL  |    21M|   261M| 48431   (1)| 00:09:42 |
    |*  6 |    INDEX UNIQUE SCAN         | ORDER_UK_ID |     1 |       |     1   (0)| 00:00:01 |
    |*  7 |   TABLE ACCESS BY INDEX ROWID| ORDER_MAT   |     1 |    40 |     2   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       3 - access("C1"."PRODUCT_ID"="C3"."PRODUCT_ID")
       4 - filter("C1"."PRODUCT_SPEC"='QSP3N4')
       6 - access("C3"."ORDER_ID"="C2"."ORDER_ID")
       7 - filter("C2"."CREATE_DATE">=TO_DATE(' 2009-01-01 00:00:00', 'syyyy-mm-dd
                  hh24:mi:ss') AND "C2"."CREATE_DATE"<=TO_DATE(' 2009-12-01 00:00:00', 'syyyy-mm-dd
                  hh24:mi:ss'))


    3、修改优化器模式为first_rows;

    delete from plan_table;
    commit;
    alter session set optimizer_mode=first_rows;
    explain plan for

    SELECT
    c2.order_num,c2.customer_id, c2.create_date, c1.product_spec
    FROM product c1, order_mat c2, order_detl c3
     where c3.order_id=c2.order_id and c1.product_id=c3.product_id and
     c1.product_spec='QSP3N4'and c2.create_date between
      to_date('2009-01-01','yyyy-mm-dd') and to_date('2009-12-01','yyyy-mm-dd');

    SELECT * FROM table(DBMS_XPLAN.DISPLAY);

    Plan hash value: 3184491401
     
    --------------------------------------------------------------------------------------------
    | Id  | Operation                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |             |    18 |  1314 | 49369   (1)| 00:09:53 |
    |   1 |  NESTED LOOPS                |             |       |       |            |          |
    |   2 |   NESTED LOOPS               |             |    18 |  1314 | 49369   (1)| 00:09:53 |
    |   3 |    NESTED LOOPS              |             |   122 |  4026 | 49125   (1)| 00:09:50 |
    |*  4 |     TABLE ACCESS FULL        | PRODUCT     |     1 |    20 |   694   (1)| 00:00:09 |
    |*  5 |     TABLE ACCESS FULL        | ORDER_DETL  |   122 |  1586 | 48431   (1)| 00:09:42 |
    |*  6 |    INDEX UNIQUE SCAN         | ORDER_UK_ID |     1 |       |     1   (0)| 00:00:01 |
    |*  7 |   TABLE ACCESS BY INDEX ROWID| ORDER_MAT   |     1 |    40 |     2   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       4 - filter("C1"."PRODUCT_SPEC"='QSP3N4')
       5 - filter("C1"."PRODUCT_ID"="C3"."PRODUCT_ID")
       6 - access("C3"."ORDER_ID"="C2"."ORDER_ID")
       7 - filter("C2"."CREATE_DATE">=TO_DATE(' 2009-01-01 00:00:00', 'syyyy-mm-dd
                  hh24:mi:ss') AND "C2"."CREATE_DATE"<=TO_DATE(' 2009-12-01 00:00:00', 'syyyy-mm-dd
                  hh24:mi:ss'))

    4、再次优化器模式为rule;

    delete from plan_table;
    commit;
    alter session set optimizer_mode=rule;
    explain plan for

    SELECT
    c2.order_num,c2.customer_id, c2.create_date, c1.product_spec
    FROM product c1, order_mat c2, order_detl c3
     where c3.order_id=c2.order_id and c1.product_id=c3.product_id and
     c1.product_spec='QSP3N4'and c2.create_date between
      to_date('2009-01-01','yyyy-mm-dd') and to_date('2009-12-01','yyyy-mm-dd');


    SELECT * FROM table(DBMS_XPLAN.DISPLAY);
    Plan hash value: 1465182523
     
    --------------------------------------------------------
    | Id  | Operation                      | Name          |
    --------------------------------------------------------
    |   0 | SELECT STATEMENT               |               |
    |   1 |  NESTED LOOPS                  |               |
    |   2 |   NESTED LOOPS                 |               |
    |   3 |    NESTED LOOPS                |               |
    |   4 |     TABLE ACCESS FULL          | ORDER_DETL    |
    |*  5 |     TABLE ACCESS BY INDEX ROWID| ORDER_MAT     |
    |*  6 |      INDEX UNIQUE SCAN         | ORDER_UK_ID   |
    |*  7 |    INDEX UNIQUE SCAN           | PRODUCT_PK_ID |
    |*  8 |   TABLE ACCESS BY INDEX ROWID  | PRODUCT       |
    --------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       5 - filter("C2"."CREATE_DATE"<=TO_DATE(' 2009-12-01 00:00:00',
                  'syyyy-mm-dd hh24:mi:ss') AND "C2"."CREATE_DATE">=TO_DATE(' 2009-01-01
                  00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
       6 - access("C3"."ORDER_ID"="C2"."ORDER_ID")
       7 - access("C1"."PRODUCT_ID"="C3"."PRODUCT_ID")
       8 - filter("C1"."PRODUCT_SPEC"='QSP3N4')
     
    Note
    -----
       - rule based optimizer used (consider using cbo)

    5、再次优化器模式为为默认值,在语句中中加入提示,比较和第一步的代价

    delete from plan_table;
    commit;
    alter session set optimizer_mode=all_rows;
    explain plan for

    SELECT /*+ use_hash(c2) */
    c2.order_num,c2.customer_id, c2.create_date, c1.product_spec
    FROM product c1, order_mat c2, order_detl c3
     where c3.order_id=c2.order_id and c1.product_id=c3.product_id and
     c1.product_spec='QSP3N4'and c2.create_date between
      to_date('2009-01-01','yyyy-mm-dd') and to_date('2009-12-01','yyyy-mm-dd');

    SELECT * FROM table(DBMS_XPLAN.DISPLAY);

    Plan hash value: 1587320179
     
    ----------------------------------------------------------------------------------
    | Id  | Operation           | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |            |    18 |  1314 | 59730   (1)| 00:11:57 |
    |*  1 |  HASH JOIN          |            |    18 |  1314 | 59730   (1)| 00:11:57 |
    |*  2 |   HASH JOIN         |            |   122 |  4026 | 49191   (1)| 00:09:51 |
    |*  3 |    TABLE ACCESS FULL| PRODUCT    |     1 |    20 |   694   (1)| 00:00:09 |
    |   4 |    TABLE ACCESS FULL| ORDER_DETL |    21M|   261M| 48431   (1)| 00:09:42 |
    |*  5 |   TABLE ACCESS FULL | ORDER_MAT  |   298K|    11M| 10538   (1)| 00:02:07 |
    ----------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - access("C3"."ORDER_ID"="C2"."ORDER_ID")
       2 - access("C1"."PRODUCT_ID"="C3"."PRODUCT_ID")
       3 - filter("C1"."PRODUCT_SPEC"='QSP3N4')
       5 - filter("C2"."CREATE_DATE">=TO_DATE(' 2009-01-01 00:00:00',
                  'syyyy-mm-dd hh24:mi:ss') AND "C2"."CREATE_DATE"<=TO_DATE(' 2009-12-01
                  00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

  • 相关阅读:
    AcWing 1175. 最大半连通子图  
    【Nginx】如何用静态网页替换掉Nginx的固有欢迎界面(使用用户root+ufo)
    【Redis】rediscli设定过期时限
    【转载】Oracle之DBMS_RANDOM包详解
    【Nginx】部署静态页面网站(全程使用用户root)
    【CentOs/Nginx】把Nginx1.20.2在linux上run起来(详版)
    【Springboot】极简Springboot程序
    【data masking】遮盖脱敏方式与替换脱敏方式的简单实现
    Nginx和Redis相对于ES的速度证明,要做一名优秀的编程员,必须掌握C
    【java/regexp】将字符串中从第四位到第七位替换成星号
  • 原文地址:https://www.cnblogs.com/oldcat/p/3142121.html
Copyright © 2020-2023  润新知