作家
登录

从此爱上SQL Monitor!记一次反常理的鉴权查询优化

作者: 来源: 2017-11-30 11:19:25 阅读 我要评论

CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了


经由过程反复注释加测试,诡异的现象出现了:

好气象,坏SQL

金秋10月,如同阳春三月般,是一个令人难以忘记与等待的季候。而在这个好梦的季候了,我拿到了一个不怎么令人愉悦的SQL。

按照膳绫擎的流程与算法,就很轻易懂得上述那组数字了。同样的,也明白了为何权限设备匀毁的时刻机能越差,设备越多的时刻机能反而越好。

优化小组的测试MM给我发了封关于机能问题的邮件,在邮件琅绫擎,问题描述是如许的:权限设备匀毁,机能越差,当设备了全部(2万)du的权限时,只须要2s,当只设备了120个DU的权限时,须要半小时以上。

看到这个描述,我心里也咯噔了一下:这是违背了常理的。一般来说,只有越大年夜越慢,如今反而是越小越慢。

按照习惯,我照样想先见识见识这个一反常理的SQL,看看到底是何方神圣。我找开辟人员拿到了SQL,打开代码如下:   

                               

大年夜体量上看,这个SQL并不大年夜,总共才130多行。这在I项目组中是比较常见的。而大年夜体型上看,似乎不怎么调和:尾巴太大年夜。在WHERE前提子句,拖着5个EXISTS前提,并且都是OR的关系。这已经很不平常了,会不会就是问题中描述的问题地点呢?

我向开辟人员咨询了这5个EXISTS子萌芽的营业功能,获得的信息是:

1、这5个EXISTS子萌芽的功能是鉴权,即权限辨别;

2、不合EXISTS子萌芽代表不合类型的权限集合;

3、鉴权的对象粒度是DU,即每个EXISTS子萌芽与EXISTS子萌芽的接洽关系字段都是LINE.DU_ID

大年夜SQL自身看,找不到明显的“马脚”,我就测验测验着看看履行筹划,在SQL DEV中按下了F5,显示的履行筹划如下:

履行筹划比较长,我们可以只看exists部分,发明根本上都是索引扫描,cost值也异常低,也就是说履行筹划中也看不出问题。那问题到底出在哪里呢?

笨办法,好效不雅

当时就在想:是单个exists慢?照样5个放在一路慢呢?

为了弄清跋扈这个原因,我就逐个注释掉落EXISTS,并不雅察注释后的机能。固然这个办法有些愚蠢,甚至很多人都不齿于该办法,但有些时刻这确切也是定位问题的有效的手段和门路。

1、5个exists前提零丁感化时,没有机能问题;

2、第一个和第三个exists前提结合感化时,也没有机能问题;

3、第三个、第四个和第五个exists前提结合感化时,机能问题就凸显了。

由此看来,问题越来越复杂了。Oracle在履行这条SQL时到底产生了什么呢?千头万绪理还乱,束手无策想不通。万般无奈之下,只能祭出必杀神器:SQL Monitor。

神器不出,莫与争锋

不见兔子不撒鹰

在拿到SQL Monitor的结不雅后,似乎一切都晴明起来了,SQL Monitor的截图如下(因为当时的原始数据损掉,以下仅给出模仿数据):

因为已经明白了是在exists子萌芽存在机能问题,我就重点存眷了EXISTS的Monitor信息,欲望能大年夜中发明有价值的信息与启发。

在比较了5个exists的履行筹划后,“履行次数”引起了我的留意:5个EXISTS的履行次数及实际施数竟然不一样!

(1)这组数字之间也有着奇妙的接洽:第一个的履行次数为20000,及正好是总的DU数量,第二个的履行次数等于第一个的履行次数-第一个实际施数,即知足如下算法:

(2)第一个和第二个exists的实际返回行数的和是120,恰好是邮件中说起的权限设备数量;而第三个19880加上120正好等于2万,又恰好是全部DU数。难道这一切仅仅是偶合罢了?照样另有隐情呢?

个中f(n)为第n个exists的履行次数,e(n)为第n个exists的实际返回行数,并且n>1。

基于以上两点信息,我豁然开朗仗然大年夜悟,个中启事了然于胸。我们可以大年夜致揣摸出Oracle的履行道理如下图所示:

为了更好地舆解,这里可以举两个极端的例子。如不雅有没有设备任何权限,那么每个DU都须要遍历5个exists子萌芽,就意味着总共要履行10万次(2万DU,每个DU履行5次)exists子萌芽。反过来,如不雅我们将2万DU都设备了权限,并且是第一类权限(即第一个exists的权限),那么每个DU只须要履行第一个exists,后面4个exists子萌芽不须要履行。是以只须要履行2万次。2万次与10万次的差别(别的还须要推敲不合exists之间本身机能也是有差别的),对机能的影响照样异常明显的。

拨开云雾不等于立见天日

覆盖在诡异机能问题上的云雾终于被揭开了,但我却涓滴没有欣喜之感。问题的原因固然已经“大年夜白于世界”,但解决筹划让我束手无策。

一开端,我测验测验着基于现有SQL经由过程SQL Hint干涉履行筹划,然则机能毫无起色。我又测验测验着改写这个SQL,将OR EXISTS子萌芽改写成LEFT JOIN,机能问题却变本加厉。我还测验测验着创建基于该SQL的特定索引,仍然无济于事。


  推荐阅读

  程序员如何做到年薪超过60万?

2. 金融巨擘 CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了 附一张阿里的级别对应薪资不仅限于 BAT,其他盈利才能强的互联网大年夜公司,高层技巧员工达到60万以上年薪是比较>>>详细阅读


本文标题:从此爱上SQL Monitor!记一次反常理的鉴权查询优化

地址:http://www.17bianji.com/lsqh/39321.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)