首页 > 数据库 >SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划

SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划

时间:2024-01-23 15:32:33浏览次数:37  
标签:lob 逻辑 join 读取 EXISTS -- 计数 预读 物理

    在使用Exists时,如果能正确使用,有时会提高查询速度:

      1,使用Exists代替inner join

      2,使用Exists代替 in

 

  1,使用Exists代替inner join例子:

     在一般写sql语句时通常会遇到如下语句:

      两个表连接时,取一个表的数据,一般的写法通过关联查询(inner join):      

select a.id, a.workflowid,a.operator,a.stepid
from  dbo.[[zping.com]]] a
inner join workflowbase b on a.workflowid=b.id
and operator='4028814111ad9dc10111afc134f10041'

查询结果:

(1327 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'workflowbase'。扫描计数 1,逻辑读取 293 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 '[zping.com]'。扫描计数 1,逻辑读取 1339 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 

exists来取数据

select a.id,a.workflowid,a.operator ,a.stepid
from  dbo.[[zping.com]]] a where exists

(select 'X' from workflowbase b where a.workflowid=b.id)
and operator='4028814111ad9dc10111afc134f10041'

 执行结果:  

(1327 行受影响)
表 '[zping.com]'。扫描计数 1,逻辑读取 1339 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'workflowbase'。扫描计数 1,逻辑读取 291 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 

EXISTS比inner join少 2个IO, 对比执行计划成本不一样, 看看两着的差异:  

 

SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划_数据

 

这时我们发现使用EXISTS要比inner join效率稍微高一下。  
     2,使用Exists代替 in

      要求:编写workflowbase表中id不在表中dbo.[[zping.com]]]的行:      

       一般的写法:

select * from workflowbase 
 where  id not in (
select  a.workflowid
from  dbo.[[zping.com]]] a )

执行结果:

(1 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 '[zping.com]'。扫描计数 5,逻辑读取 56952 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'workflowbase'。扫描计数 3,逻辑读取 1589 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    使用Existsl来写:

select * from workflowbase b
 where not exists(
select 'X'
from  dbo.[[zping.com]]] a where a.workflowid=b.id )

   看看执行结果

(1 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 '[zping.com]'。扫描计数 3,逻辑读取 18984 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'workflowbase'。扫描计数 3,逻辑读取 1589 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

56952+1589=58541次

18984+1589=20573次  (使用Exists)

   使用exists是in的2.8倍,查询性能提高很大。

 

 

   EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。



标签:lob,逻辑,join,读取,EXISTS,--,计数,预读,物理
From: https://blog.51cto.com/u_16532032/9380481

相关文章

  • SQL SERVER2005 Index Scan效率
    SQLSERVER2000中,包括网上都说查询时“abc%”能使用到索引,“%abc%”不能使用到索引,一次做培训的时候,给大家介绍“%abc%”不能使用索引的例子发现,在SQLSERVER2005中是可能用到索引。在SQLSERVER2005中查询优化器的确做了很大提高,以下是例子: [[zping.com]]]中operator建立索引i......
  • 电子秤芯片方案/吊钩秤主控CSU8RP1185
     在生活中,买菜时常常出现缺斤少两的情况,这种情况多是商家秤有很大问题,往往消费者是最吃亏的,这种情况下,我们最好是带个吊钩电子秤,测量菜的重量,有问题直接拨打举报电话举报商家,使商家得到应有的惩罚。 话说回来,重点在于吊钩电子秤,这种小型的电子秤,市面上有的生产商有很多,知名的......
  • 经典存储过程计算报表
       用单一存储过程计算报表,替换以前用java+Hibernate的给客户做的计算报表,客户每次用后系统慢等各种问题,该存储过程是当时花了近一周时间,看以前的逻辑,修改的,一开始觉得很简单,但越做越复杂,中途都想放弃,最终坚持下来,完整的替换了以前程序单条SQL计算,保留下来脚本,做纪念!IFEXIS......
  • 无心的力量
    多年前我认识一位老法师,在江苏的一个偏僻地方山上的寺院里,他老人家那会已经八十多了,虽然是住持,可是他也是一位画僧,天天在寺庙禅房里画画,很多社会上的人都去找他画画结缘。他画的画很有禅意。老和尚按照他的宗派脉络,好像是和弘一法师有关我记得。可是这位老和尚,生性不爱交际,不喜欢讲......
  • [Design Pattern] Intro: Three groups of patterns
    Creationalpatternsprovideobjectcreationmechanismsthatincreaseflexibilityandreuseofexistingcode.Factorymethod:Providesaninterfaceforcreatingobjectsinasuperclass,butallowsubclasstoalterthetypeofobjectsthatwillbecreated.......
  • 博客园主题设置
    1、页面定制CSS\1生成博客目录的CSS2#uprightsideBar{3font-size:12px;4font-family:Arial,Helvetica,sans-serif;5text-align:left;6position:fixed;/*将div的位置固定到距离top:50px,right:0px的位置,这样div就会处在最右边的位置,距离顶部50......
  • 在IIS中添加7z MIME 类型
    在InternetInformationServices(IIS)中添加7zMIME类型,允许服务器识别和正确处理.7z文件。下面是如何在IIS中添加7zMIME类型的步骤:打开IIS管理器:点击“开始”按钮,打开“运行”,输入inetmgr,然后按回车键,或者通过控制面板中的“管理工具”来启动IIS管理器。选择你要配置......
  • 应用集成(iPaaS)和数据集成(ETL)高效协同的最佳实践
    随着企业数字化的步伐加快,企业IT工程师和数据工程师在应用和数据集成方面的工作变得日益密切。IT工程师通常利用iPaaS(Integration Platform as a Service)来进行异构应用和数据的集成,而数据工程师则倾向于使用ELT/ETL(Extract, Transform, Load)工具来进行数据集成。两者之间如......
  • 泛微OA触发关联流程提交操作思路
    1.首先数据下数据字典,查询workflow_requestbase表的currentnodeid,currentnodetype.根据判断条件requestid查询即可2.第二部完成数据库端数据的查询更新,及前端页面的效果测试 3.更新好节点ID和节点类型后会发现流程会出现在下一个节点,这个时候编写action即可(可加各种判断条......
  • CF327C Magic Five 题解
    CF327CMagicFive搬运工单调队列优化DP加等比数列求和首先\(5\)的倍数要求末尾是\(0\)或\(5\)所以我们只用看给定字符串的\(0\)和\(5\)就好,我们钦定他是最终的数的末尾。在他之前的选择删掉,在他之后的全部删掉,方案数就是\(2^{pow-1}\),答案累加就可以了。容易想到......