• PL/SQL DEVELOPER执行计划的查看


    这里,我学到的一个很重要的东西,就是用PL/SQL DEVELOPER去看一条SELECT语句的执行计划,执行计划里面可以看到这条SELECT语句的开销、I/O操作开销等数值,可以很清晰地看到语句各个部分的执行效率。选中这条SELECT语句以后,按F5就可以。

             以下面的SELECT语句为例子: 

    PL/SQL DEVELOPER执行计划的查看 - 花刺 - 我的点点滴滴

       从三张表中取数据,按我以前的想法,只要WHERE语句那里有能让三张表连接起来的条件就可以。所以我只使用了:

    PL/SQL DEVELOPER执行计划的查看 - 花刺 - 我的点点滴滴

     按F5后,可以看到这样做的执行计划如下:

    PL/SQL DEVELOPER执行计划的查看 - 花刺 - 我的点点滴滴
    开销974,其实并不算高。但是加上测试环境的数据库连接速度确实很慢,导致了经常会出现数据库连接超时的提示。

             修改后的SELECT语句如下:

    PL/SQL DEVELOPER执行计划的查看 - 花刺 - 我的点点滴滴
          可以看到,修改只是在WHERE里面多加了两个关联条件。此时再按F5看执行计划:
     
    PL/SQL DEVELOPER执行计划的查看 - 花刺 - 我的点点滴滴
      这时候COST只剩下95了。实际操作中,确实也明显感到了操作速度的提升。

             执行计划的执行顺序是,从内层至外层,从上往下。比如上面修改后的实行计划中,数据库先对ORDER_HEADER的主键做了一个索引范围检索,然后再对XXWMS_DLX_SERIAL_NUMBER的非唯一性索引XXWMS_DLX_SERIAL_NUMBER_N4做索引范围检索。

             在做修改之前,SERIAL_NUMBER表和XXWMS_DLX_SERIAL_NUMBER表使用了循环嵌套(NESTED LOOPS)的连接方法,得到结果后再与ORDER_HEADER进行哈希连接。由于两个表的数据量都比较大(SERIAL_NUMBER在测试环境中数据量达到一千四百万条左右),循环嵌套连接的步骤显然开销了很多。

             可以猜想,如果循环嵌套连接中其中一个表的数据量小一点,就可以减少很多开销。于是,在连接条件中多加一条xx.client_id = oh.client_id。这样就使用了ORDER_HEADER的主键去和XXWMS_DLX_SERIAL_NUMBER的N4索引进行连接,得到结果以后再去和SERIAL_NUMBER连接。结果在上图可以看到,COST只有95,大大加快了执行的效率。

             这个经历让我觉得PL/SQL的优化相当神奇,效果是一样的,但只是加一个条件就可以使得执行效率有如此大的提高。就这个改变,使得弹出来的超时提醒的几率大大降低,对于用户来说这个改变是很重要的。

     其它查看方法:
        
    需要先创建plan_table
    create table PLAN_TABLE (
            statement_id         varchar2(30),
            timestamp            date,
            remarks              varchar2(80),
            operation            varchar2(30),
            options               varchar2(255),
            object_node          varchar2(128),
            object_owner         varchar2(30),
            object_name          varchar2(30),
            object_instance numeric,
            object_type     varchar2(30),
            optimizer       varchar2(255),
            search_columns  number,
            id                numeric,
            parent_id        numeric,
            position        numeric,
            cost                numeric,
            cardinality        numeric,
            bytes                numeric,
            other_tag       varchar2(255),
            partition_start varchar2(255),
            partition_stop  varchar2(255),
            partition_id    numeric,
            other                long,
            distribution    varchar2(30),
            cpu_cost        numeric,
            io_cost                numeric,
            temp_space        numeric);

    建表的sql在rdbms/admin下有,名字是utlxplan.sql
    我用的是9i,其他版本的名字可能不一样,
    然后执行
    explain plan for sql语句
    然后可以执行这个sql看结果
    SELECT LPAD (' ', 2 * LEVEL) ||
           operation ||
           ' ' ||
           options ||
           ' ' ||
           object_name query_plan
      FROM plan_table
    CONNECT BY PRIOR id = parent_id
    START WITH id = 1
    ORDER BY id;

  • 相关阅读:
    母函数详解
    java中为什么要实现序列化,什么时候实现序列化?
    cocos2dx&cocosbuilder折腾记
    Unity3D系列教程–使用免费工具在Unity3D中开发2D游戏 第二节(下)
    分頁查詢
    獲取CPU,硬盤序列號
    spcomm
    dbgrideh的導入和導出
    程序窗体及控件自适应分辨率
    組合的藝術
  • 原文地址:https://www.cnblogs.com/zhangyublogs/p/5176829.html
Copyright © 2020-2023  润新知