Home >Database >Mysql Tutorial >SQL优化之not in

SQL优化之not in

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-07 17:44:251409browse

阅读目录 一直从事运维的工作,免不了优化一些SQL语句,因为本人比较懒的原因,很多经典的案例没有记录下来,深表遗憾 案例语句 某大型房地产公司,巡检日期2013-04-22,问题语句 ( * ) .Application , 3 COUNT ( * ) AS UserCount 4 FROM ( SELECT f.Applic

阅读目录

一直从事运维的工作,免不了优化一些SQL语句,因为本人比较懒的原因,很多经典的案例没有记录下来,深表遗憾

案例语句

某大型房地产公司,巡检日期2013-04-22,问题语句

(*) .Application , 3 COUNT(*) AS UserCount 4 FROM ( SELECT f.Application 5 FROM myUserRights ur myFunction f ON ur.ObjectType = f.FunctionCode myUser u ON ur.UserGUID = u.UserGUID ( IsDisabeld IsDisabeld ) ( 13 SELECT UserGUID 14 FROM myUserRoles ) f.Application , 17 ur.UserGUID .Application 20 ) AS temp2 myApplication a ON a.Application = temp2.Application a.Application IN ( 24 SELECT Application 25 FROM myFunction , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ) Application ) temp2.UserCount temp2.UserCount ) > a.LicenseUserCount

表 'Worktable'。扫描计数 1,逻辑读取 109 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'myUserRoles'。扫描计数 1,逻辑读取 73 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'myUserRights'。扫描计数 2772576,逻辑读取 11812753 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'myFunction'。扫描计数 2,逻辑读取 90043 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'myUser'。扫描计数 1,逻辑读取 163 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'myApplication'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)
表 'Worktable'。扫描计数 1,逻辑读取 109 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'myUserRoles'。扫描计数 1,逻辑读取 73 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'myUserRights'。扫描计数 2772576,逻辑读取 11812753 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'myFunction'。扫描计数 2,逻辑读取 90043 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'myUser'。扫描计数 1,逻辑读取 163 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'myApplication'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 12625 毫秒,占用时间 = 12652 毫秒。
SQL Server 分析和编译时间: 
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

IO上千万,该语句是对应的一个展示页面,统计count(*)是为了分页,执行时间为12S,开始拿到该语句,一头雾水,不知如何下手。

分析手段

说说我的分析手段,这里无法把数据库给大家,所以只能是分享我的分析手段,能给大家启发就达到了本文的目的,一般拿到这种SQL语句,我首先执行一遍

然后看执行计划,找最大的开销,看能不能加索引优化,看多了也没太大用,

最大的开销在索引查找上,其实我最讨厌的就是这种,一看最大开销是索引查找,也没办法加索引去优化,一般遇到这种情况,是因为选错了执行计划导致的,

选错了执行计划是代表了你写的SQL有问题,有什么问题?SQL语句中有OR,NOT IN这些不符合SARG的,我采取了一个比较有效的验证方式,强制改变连接

方式,很暴力,也很危险

(*) .Application , 3 COUNT(*) AS UserCount 4 FROM ( SELECT f.Application 5 FROM myUserRights ur myFunction f ON ur.ObjectType = f.FunctionCode myUser u ON ur.UserGUID = u.UserGUID ( IsDisabeld IsDisabeld ) ( 13 SELECT UserGUID 14 FROM myUserRoles ) f.Application , 17 ur.UserGUID .Application 20 ) AS temp2 21 RIGHT HASH JOIN myApplication a ON a.Application = temp2.Application a.Application IN ( 24 SELECT Application 25 FROM myFunction , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ) Application ) temp2.UserCount temp2.UserCount ) > a.LicenseUserCount

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn