深入剖析:not exists对外层查询的影响

何剑敏

Oracle ACS华南区售后团队,首席技术工程师。供职于Oracle ACS华南区售后团队,首席技术工程师。多年从事第一线的数据库运维工作,有丰富项目经验、维护经验和调优经验,专注于数据库的整体运维。

编辑手记:运维中会面临各种各样的问题,有时候我们不能找到问题的根源就是因为在我们心里,有一个想当然的答案,比如认定了600就是bug,1555就是undo设置不合理,这些想当然的答案在很大程度上阻碍了我们的分析。我们通过今天的分享一起学习如何拨开云雾,发现问题的真相。

同事在12c中跑的buffer get很高,但是在10g中跑的buffer很低。怀疑是不是12c的优化器有问题。接下来我们一起来验证。

本例中的10g的环境和12c的环境,数据量大致一样,只是有很少部分的不同,但是就是这个很少部分不同,造成了not exists中的子查询返回不同的值,进而对外层查询产生不同的影响。我们来用如下的代码模拟一下。

初始化数据:

--10g

--12c

我们看到,12c的数据和10g只是有很少的差别,t1表12c和10g都一样,t2表在12c只是少了一行数据。

--10g

--12c

我们将要执行的sql语句是:

我们先来看执行情况的差距,10g的bufferget小,12c多

--10g

查看执行计划

--12c

看执行计划

可以看到第23,24行,在10g中运行时,buffers是0,而在12c中,即78,79行,buffer是2083+6496。也就是说在本次测试中,10g,外层查询不进行t1和t2的扫描,直接返回结果了,而12c,外层查询还要进行t1表和t2表层扫描才返回结果

那究竟是不是版本的差异呢?

这其实不是10g和12c的差别,而是not exists的返回数据对外层的影响。子查询要返回0行记录,才满足not exist的条件,从而返回外层查询结果。在10g中,子查询返回了一行记录

不满足not exists(即0行才满足),所以,也就不用在外层继续查询了。直接返回记录0行。

在12c中,子查询返回0行记录,满足not exist的条件,所以还需要在外层查询中继续查询。

正是这一行记录的差异,导致了not exists对外层查询的影响。进而导致整个sql的buffer get的差异。

反证这个结果,我只要在12c中,运行子查询结果返回大于0行的,不满足not exists,也应该不会去外层查询了。见下:

看执行计划

可以看到第38,39行的buffer为0.

最终我们验证了,其实并不是版本的差异。所以任何时候,一定要耐心细致地分析问题,拨开云雾,找到故障的根源。

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

原文发表时间:2016-10-21

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

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

性能下降的不定时炸弹_过旧的sql_profile(r3笔记第9天)

最近这一周以来,生产环境像是得了重病的病人一样,小问题没有修好,大问题不断。IO的等待极为严重。数据库的负载达到了几十倍,上百倍。 weblogic和tuxed...

3327
来自专栏大数据学习笔记

Hadoop基础教程-第10章 HBase:Hadoop数据库(10.1 NoSQL介绍)(草稿)

第10章 HBase:Hadoop数据库 10.1 NoSQL介绍 10.1.1 NoSQL简介 随着互联网技术(互联网+,物联网)发展,特别是大数据时代到来,...

1969
来自专栏腾讯大数据的专栏

数据库schema设计与优化

1、 前言 对于数据库而言,在日常开发中我们主要的关注点有两块,一个是schema的结构设计,另一个就是索引的优化,这两块是影响我们最终系统结构和性能的关键部分...

2065
来自专栏程序猿

从0学习MySQL系列(一)简介篇

概述 ---- 阅读本系列说明: 本系列的划分,旨在涵盖MySQL的大部分方面,旨在作为大纲,每篇文章都会有重点以及在开发中需要经常注意的地方...

3415
来自专栏华章科技

520特别版Python实战:教你用微信每天给TA说晚安

from __future__ import unicode_literals from threading import Timer from wxpy i...

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

MySQL DBA工作突围的一个入口-慢日志

在MySQL中,对于性能问题诊断,最开始的时候总是感觉有些束手无策,如果一个人问你,MySQL数据库响应慢了,该怎么办,如果数据库服务器CPU 100%了该怎么...

1132
来自专栏牛客网

VIPKID Java工程师一面

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

一次数据变更的审核过程(r8笔记第95天)

今天正在做一个数据变更操作,突然一个开发的同学找到我,看起来比较着急的样子,说想让我做一个数据变更。 当然在这种时候,我正在做的数据变更操作已经被打断了...

2627
来自专栏CSDN技术头条

盘点一下影响MySQL性能的因素

既然要优化数据库,我们就首先要知道,优化的是什么,或者说:什么因素影响了数据库的性能。

1194
来自专栏MySQL实战分享

数据库评测报告第二期:MongoDB-3.2

看到MongoDB如此特性和优势,不免勾起了我们的好奇心。这一期的评测报告就着重针对MongoDB的读写性能的进行测试和分析,一起来揭秘一下如今MongoDB在...

6512

扫码关注云+社区