自相矛盾:Null is Not Null引发的成本误区

黄玮(Fuyuncat)

资深Oracle DBA,个人网www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价.

在SQL的世界里,总有一些情况是你意想不到的,以下这个案例可以让你理解这样一种情况。

这是一个开发者请求分析的一个SQL,原因是执行计划很让人费解。首先通过Explain执行一次SQL,获取执行计划:

在以下的执行计划中,可以看到第三步骤的执行计划成本为100,而最终的成本却是0,这是让人最为费解之处:

那么仔细观察一下过滤谓词,可以看到一个奇妙之处,第二步骤处有一个过滤谓词信息,这是优化器自动添加上去的,其判定为NULL IS NOT NULL,这显然是一个恒假的条件.

根据这个条件,Oracle无需执行所有SQL,直接返回,这也就是无论执行计划树的成本是多少,最终过滤的成本总是0,SQL无需真正执行。

那么为什么会有这样一个始终为False的条件呢?从SQL中可以看出端倪。

在SQL代码中存在如下条件:

6 AND NVL(MVMT.EVENT_CURRENT_CONTRA_IND,'0')='DELETED' 7 AND NVL(MVMT.EVENT_CURRENT_CONTRA_IND,'0')= 'ROLLBACK'

按照这个条件,'DELETED'='ROLLBACK',这显然不可能,所以出现了恒假的条件,最终确认是程序员的疏忽导致的错误编码。

在程序的世界里,什么事情都可能发生,所以在开发过程中进行必要的SQL审核,不可缺少。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-08-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏james大数据架构

你真的会玩SQL吗?三范式、数据完整性

你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真...

1977
来自专栏微信公众号:Java团长

Java基础06 组合

我们已经尝试去定义类。定义类,就是新建了一种类型(type)。有了类,我们接着构造相应类型的对象。更进一步,每个类型还应该有一个清晰的接口(interface)...

502
来自专栏王亚昌的专栏

合理使用const,慎用自运算

    项目最的出了几次运营事故,都是因为使用自乘、自加、自減运算,错改了非局部变量,导致将用户数据写溢出,最终只能进行回档处理。先给大家展示一下,漏出bug的...

601
来自专栏Java进阶

为什么会要序列化

25710
来自专栏编程

用JS 封装类似于JQ中animate的动画效果

前言:现在网上对这种类似的代码繁多,但是都是各家所长,希望源码时代H5前端讲师写的代码能够帮助到需要这样效果的朋友。 首先说一下,这篇文章对初学者有很大的帮助,...

1905
来自专栏用户画像

实验5.1 存储过程的建立与使用

使用CREATE  PROCEDURE语句创建存储过程,ALTER  PROCEDURE语句修改存储过程,DROP  PROCEDURE语句删除存储过程,存储过...

453
来自专栏前端说吧

JS-流程控制汇集

3256
来自专栏Vamei实验室

Java基础06 组合

我们已经尝试去定义类。定义类,就是新建了一种类型(type)。有了类,我们接着构造相应类型的对象。更进一步,每个类型还应该有一个清晰的接口(interface)...

1918
来自专栏怀英的自我修炼

Java漫谈5

吴军老师有在他的《硅谷来信》中分享过他对于人工智能的看法,吴老师就认为,人工智能不会发展成黑客帝国的那种恐怖境地,原因是当初科学家在创立计算机之前先把人类要解决...

3479
来自专栏我的技术专栏

C++ 自由存储区是否等价于堆?

1424

扫描关注云+社区