首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Oracle优化器的“短路”

Oracle优化器的“短路”

作者头像
bisal
发布2021-09-06 15:44:11
发布2021-09-06 15:44:11
3100
举报

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

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

代码语言:javascript
复制
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,

代码语言:javascript
复制
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设置非空约束,会出现什么现象?

代码语言:javascript
复制
SQL> alter table t_Null modify id not null;
Table altered.

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

代码语言:javascript
复制
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就是个无意义的操作,返回肯定是空,既然如此,不需要消耗资源为了得到一个已经确定的结果,因此直接使用了这个“短路”条件,结束了这次执行。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档