自相矛盾: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 条评论
登录 后参与评论

相关文章

来自专栏社区的朋友们

Python 操作 MySQL 的正确姿势

使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能是 MySQLdb),PyMySQL 和 SQLAlchemy 。本文主...

3.6K0
来自专栏性能与架构

建立索引后的代价到底有多大?

前几天写的文章“MySQL 性能优化案例:覆盖索引”,介绍了使用覆盖索引优化查询的方式,受到了一个网友的批评 批评的内容为: “直接从索引放回数据很快是个常...

3497
来自专栏数据库新发现

一道面试题引出的系列数据库性能,数据安全问题及解决方案

友情链接:http://enmotech.com/web/classify/43.html

812
来自专栏杨建荣的学习笔记

最近的几个技术问题总结和答疑(九)(r10笔记第16天)

最近的琐事比较多,而提问题的朋友还是不少,很多消息都没有来得及回复,各种事情一堆起来,不少问题想起来已经过了好几天了,所以还是来整理一篇技术问答为好。 ...

3354
来自专栏CDA数据分析师

什么数据库最适合数据分析师

数据分析师都想使用数据库作为数据仓库处理并操作数据,那么哪一款数据库最合适分析师呢?虽然网上已经有很多对各种数据库进行比较的文章,但其着眼点一般都是架构、成本、...

2025
来自专栏黑泽君的专栏

MySQL各版本的区别

MySQL 的官网下载地址:https://www.mysql.com/downloads/

1.2K2
来自专栏杨建荣的学习笔记

使用shell脚本抽取MySQL表属性信息

在最近抽取了数据库层级的信息之后,我们可以基于已有的数据做一些分析,比如那些业务属于僵尸业务,可以通过分析binlog的偏移量来得到一个初版的信息,如果在一个周...

1033
来自专栏杨建荣的学习笔记

学习Oracle和MySQL推荐的几本书

已经很多次收到后台网友的留言或者私信了,对于学习Oracle和MySQL,他们都有类似的疑问,我就索性放在一起来回答下。 简单来说,官方文档是最好的...

5786
来自专栏数据和云

数据架构:中国电信的Oracle Sharding架构应用案例分析

Oracle 自 12.2 版本推出了 Sharding 的分布式架构,通过对于分区表的特性延展将原来的集中式架构分散开来,这一特性推出之后,引起了很多行业客户...

3636
来自专栏数据和云

千头万绪:从一道面试题看数据库性能和安全的方方面面

这个问题在朋友圈引起了很多朋友的兴趣,转发并且提问,希望有一个标准答案输出作为参考。

671

扫码关注云+社区