zoukankan      html  css  js  c++  java
  • "DISTINCT" make huge difference

    上一篇提到的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操作。

  • 相关阅读:
    LeetCode 100. 相同的树(Same Tree) 2
    LeetCode 680. 验证回文字符串 Ⅱ(Valid Palindrome II) 1
    MySQL索引操作
    MySQL数据库的一些方法使用
    Anaconda安装新模块
    源码下载
    mongodb内建角色
    windows server 2008开启共享文件设置
    MySQL配置说明
    MySQL的连接数
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/3423827.html
Copyright © 2011-2022 走看看