上一篇提到的UNION/UNION ALL会影响执行计划,再次碰到一个类似的问题。一个SQL加了DISTINCT跟不加DISTINCT的执行计划完全不同,导致执行时间差了好多倍。

原始的SQL如下所示, (注意DISTINCT)

执行计划如下所示,

这个执行计划最耗时的一步是"BUFFER SORT"执行了6982次。当然这个跟View - V_TEMP_口口_PROP_HIST 有一定关系。不过要知道 IN 子查询的结果集最多是1,因为用了ROWNUM=1. (其实在这个例子中结果集是NULL).

仔细看这个执行计划就会发现优化器是先对V_TEMP_口口_PROP_HIST 进行处理,然后进行过滤IN子查询! 这是个相当不高效的做法 - 注意执行计划中的 ”FILTER“ 操作。

但是当把DISTINCT去掉之后的话,执行计划就会大相径庭。

执行计划如下,

这次看到优化器还用了NL,而不是FILTER. 而且很聪明滴用了IN 子查询作为驱动表,然后跟外围查询做Nested Loop Join. 因为子查询的结果集为NULL,很显然JOIN操作其实也不会执行了,从"STARTS"可以看得很清楚!

有时候真是搞不清楚优化器是怎么生成执行计划的,郁闷... 这得了解优化器的实现机制才能得到答案了,我猜...

不过解决这个SQL的方式很简答了,就是把IN改成普通的表连接方式。”显示“地告诉优化器走表连接,而不是做FILTER操作。

"DISTINCT" make huge difference的更多相关文章

  1. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  2. Named function expressions demystified

    Introduction Surprisingly, a topic of named function expressions doesn't seem to be covered well eno ...

  3. Google C++ 代码规范

    Google C++ Style Guide   Table of Contents Header Files Self-contained Headers The #define Guard For ...

  4. [C4] Andrew Ng - Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization

    About this Course This course will teach you the "magic" of getting deep learning to work ...

  5. [C3] Andrew Ng - Neural Networks and Deep Learning

    About this Course If you want to break into cutting-edge AI, this course will help you do so. Deep l ...

  6. [C2P3] Andrew Ng - Machine Learning

    ##Advice for Applying Machine Learning Applying machine learning in practice is not always straightf ...

  7. 吴恩达深度学习课后习题第5课第1周第3小节: Jazz Improvisation with LSTM

    目录 Improvise a Jazz Solo with an LSTM Network Packages 1 - Problem Statement 1.1 - Dataset What are ...

  8. 【转载学习前辈的经验】-- Mistakes I made (as a developer) 我(作为一名开发者)所犯过的错误

    我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不 ...

  9. redis该如何分区-译文(原创)

    写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. P ...

随机推荐

  1. STL - 容器 - Set

    Set根据特定排序准则,自动将元素排序. Set不允许元素重复. 一些常规操作: SetTest.cpp #include <iostream> #include <set> ...

  2. 3DMax脚本插件--改动材质&amp;贴图名称

    从网上淘到了一套人物的模型,当时的心情是激动无比,掏出用的不熟练的3DMax折腾了半天.突然发现了一个蛋疼的事儿,所有的模型文件,材质名称,子材质,以及贴图所实用的是中文命名!! ! 尽管说是能跑,只 ...

  3. python中的静态成员方法和类成员方法

    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...

  4. TP框架中APP_SUB_DOMAIN_DEPLOY什么意思?

    'APP_SUB_DOMAIN_DEPLOY' => false, // 是否开启子域名部署 thinkphp开启域名部署/子域名部署/泛域名部署/IP访问部署            Think ...

  5. ADOX

    1.ADOX 概述 Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) ...

  6. ng-src 的坑

    问题: <ion-slide ng-repeat="item in bannrImgData" ng-click="getActivity($index)" ...

  7. SPOJ 74. Divisor Summation 分解数字的因子

    本题有两个难点: 1 大量的数据输入.没处理好就超时 - 这里使用buffer解决 2 因子分解的算法 a)暴力法超时 b)使用sieve(筛子),只是当中的算法逻辑也挺不easy搞对的. 数值N因子 ...

  8. java String分配内存空间备忘

    栈内存 堆内存 基础类型,对象引用(堆内存地址) 由new创建的对象和数组, 存取速度快 相对于栈内存较慢 数据大小声明周期必须确定 分配的内存由java虚拟机自动垃圾回收器管理.动态分配内存大小 共 ...

  9. Knockout.js 数据验证之插件版和无插件版

    本文我们将介绍使用 Knockout.js 实现一些基本的数据验证.就如我们在标题里提到的,我们会使用两种方法来创建数据验证方法. 使用自定义方法,不需要任何插件 最简单的方法是使用已有的插件 如果你 ...

  10. 微信QQ的二维码登录原理js代码解析

    这篇文章主要大家详细解析了微信QQ的二维码登录原理js代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗 ...