暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle优化器的“短路”

561

我们知道,Oracle软件最核心的组件就是优化器,可以说他决定了一条SQL能否正确执行的路径,这两天就碰到了一个场景。

创建测试表,插入两条测试的数据,

    SQL> create table t_null (id number, name varchar2(1));
    Table created.

    SQL> insert into t_null values(1, '');
    1 row created.

    SQL> insert into t_null values(2, 'a');
    1 row created.

    SQL> commit;
    Commit complete.

    SQL>
    ID N
    ---------- -
    1
    2 a

    此时,如果按照id判断是否为空的操作,如下所示,谓词信息是id is null,

      select * from t_Null where id is null;
      ----------------------------------------------------------------------------
      | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
      ----------------------------------------------------------------------------
      | 0 | SELECT STATEMENT | | 1 | 15 | 3 (0)| 00:00:01 |
      |* 1 | TABLE ACCESS FULL| T_NULL | 1 | 15 | 3 (0)| 00:00:01 |
      ----------------------------------------------------------------------------
      Predicate Information (identified by operation id):
      ---------------------------------------------------
         1 - filter("ID" IS NULL)

      如果我们将id设置非空约束,会出现什么现象?

        SQL> alter table t_Null modify id not null;
        Table altered.

        谓词信息改成了null is not null,预估Cost=0,

          select * from t_Null where id is null;
          -----------------------------------------------------------------------------
          | Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
          -----------------------------------------------------------------------------
          | 0 | SELECT STATEMENT | | 1 | 15 | 0 (0) | |
          |* 1 | FILTER | | | | | |
          | 2 | TABLE ACCESS FULL| T_NULL | 2 | 30 | 3 (0) | 00:00:01 |
          -----------------------------------------------------------------------------
          Predicate Information (identified by operation id):
          ---------------------------------------------------
             1 - filter(NULL IS NOT NULL)

          null is not null,明显是个不成立的条件,相当于此处Oracle做了一个“短路”的处理,从逻辑上说,id字段,不可能存在空值,where使用id is null就是个无意义的操作,返回肯定是空,既然如此,不需要消耗资源为了得到一个已经确定的结果,因此直接使用了这个“短路”条件,结束了这次执行。

          优化器的处理,还是很具备逻辑性的,值得学习。

          近期更新的文章:

          小白学习MySQL - MySQL会不会受到“高水位”的影响?

          MySQL行转列的小需求

          Oracle的greatest和least函数

          我的股市生涯

          Oracle创建主键的三种方式

          非Oracle Linux下Oracle 19c CDB数据库安装

          案例纠正一则

          小白学习MySQL - 数据库软件和初始化安装

          小白学习MySQL - 闲聊聊

          Redis和Sentinel的安装部署和配置

          “火线”和“零线”

          通过索引提升SQL性能案例一则

          如何手动添加jar包到maven本地库?

          1元股权转让的一点思考

          如何打造一个经常宕机的业务系统?

          Linux恢复误删文件的操作

          Linux的scp指令使用场景

          Oracle处理IN的几种方式

          如何搭建一支拖垮公司的技术团队?

          IP地址解析的规则

          MySQL的skip-grant-tables

          国产数据库不平凡的一年

          Oracle要求顺序的top数据检索问题

          日常工作中碰到的几个技术问题

          了解一下sqlhc

          Oracle的MD5函数介绍

          Oracle 19c的examples静默安装

          sqlplus登录缓慢的解决

          VMWare 11安装RedHat Linux 7过程中碰到的坑

          COST值相同?是真是假?

          Oracle 11g的examples静默安装

          文章分类和索引:

          公众号700篇文章分类和索引

          文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论