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

相关文章

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

不可多得的后端架构师技术图谱!内附参考资料!

由于知识点众多,特整理在GitHub上,微信外链限制,无法在文本中直接加上超链接,有需要的欢迎Start/Fork,地址如下:

1012
来自专栏数据和云

新书连载:Oracle数据库的跟踪和分析方法

编辑说明:《Oracle性能优化与诊断案例精选》出版以来,收到很多读者的来信和评论,我们会通过连载的形式将书中内容公布出来,希望书中内容能够帮助到更多的读者朋友...

3249
来自专栏圣杰的专栏

性能优化知多少

1. 引言 最近一段时间,系统新版本要发布,在beta客户测试期间,暴露了很多问题,除了一些业务和异常问题外,其他都集中在性能上。有幸接触到这些性能调优的机会,...

1809
来自专栏张善友的专栏

PostgreSQL 9.3发布

9月9日,PostgreSQL全球开发组宣布了9.3版发布的消息。从2010年9.0版开始,PostgreSQL已经连续四个版本稳定地按时在每年9月中旬发布,从...

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

通过Snapshot Standby来精确评估SQL性能 (r9笔记第73天)

最近处理了一个需求,比较紧急,映射到数据库层面是需要更新17万id的值,听起来是不少,根据数据架构进行了分析,发现目前是做了分库分表的方式,所以这17万的id在...

3013
来自专栏数据和云

SQL审核:OR展开与子查询优化案例详解

黄廷忠(网名:认真就输) 云和恩墨技术专家 个人博客:http://www.htz.pw/ 本篇整理内容是黄廷忠在“云和恩墨大讲堂”微信分享中的讲解案例,S...

3414
来自专栏沈唁志

2018年韩创科技旗下我图网PHP工程师面试题分享

4. 一张采用Innodb的User表,其中id为主键,name为普通索引,试从索引的数据结构角度分析,以下两条语句(均返回一条记录)在检索过程中有哪些区别

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

数据同步中的误导(r7笔记第34天)

今天同事让我帮一个忙,说现在有两个环境中的一张表数据不一致,已经造成了一些数据问题,他们已经排查了一圈,最后发现是一张表的数据问题导致,希望我来帮忙协助一下。 ...

3418
来自专栏python3

mysql-外键的三种关系

mysql> create table press(id int primary key auto_increment,name varchar(20));

883
来自专栏PingCAP的专栏

使用 Rust 构建分布式 Key-Value Store

构建一个分布式 Key-Value Store 并不是一件容易的事情,我们需要考虑很多的问题,本文将以我们开发的分布式 Key-Value TiKV 作为实际例...

4861

扫码关注云+社区