为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Server中的内连接与左连接性能

SQL Server中的内连接与左连接性能

HUX布斯 2019-07-06 13:34:22
SQL Server中的内连接与左连接性能我已经为9个表创建了使用内部联接的SQL命令,无论如何,这个命令需要很长时间(超过5分钟)。所以我的民间建议我把内部加入改为左加入,因为左联的表现更好,虽然我知道的是第一次。修改后,查询速度明显提高。我想知道为什么左连接比内部连接快?我的SQL命令如下所示:SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D诸若此类最新情况:这是我的模式简介。FROM sidisaleshdrmly a -- NOT HAVE PK AND FK     INNER JOIN sidisalesdetmly b -- THIS TABLE ALSO HAVE NO PK AND FK         ON a.CompanyCd = b.CompanyCd             AND a.SPRNo = b.SPRNo             AND a.SuffixNo = b.SuffixNo             AND a.dnno = b.dnno    INNER JOIN exFSlipDet h -- PK = CompanyCd, FSlipNo, FSlipSuffix, FSlipLine         ON a.CompanyCd = h.CompanyCd           AND a.sprno = h.AcctSPRNo             INNER JOIN exFSlipHdr c -- PK = CompanyCd, FSlipNo, FSlipSuffix         ON c.CompanyCd = h.CompanyCd           AND c.FSlipNo = h.FSlipNo             AND c.FSlipSuffix = h.FSlipSuffix      INNER JOIN coMappingExpParty d -- NO PK AND FK         ON c.CompanyCd = d.CompanyCd           AND c.CountryCd = d.CountryCd      INNER JOIN coProduct e -- PK = CompanyCd, ProductSalesCd         ON b.CompanyCd = e.CompanyCd           AND b.ProductSalesCd = e.ProductSalesCd      LEFT JOIN coUOM i -- PK = UOMId         ON h.UOMId = i.UOMId      INNER JOIN coProductOldInformation j -- PK = CompanyCd, BFStatus, SpecCd         ON a.CompanyCd = j.CompanyCd            AND b.BFStatus = j.BFStatus                     AND b.ProductSalesCd = j.ProductSalesCd             INNER JOIN coProductGroup1 g1 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup1Cd         ON e.ProductGroup1Cd  = g1.ProductGroup1Cd             INNER JOIN coProductGroup2 g2 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup2Cd         ON e.ProductGroup1Cd  = g2.ProductGroup1Cd
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

如果一切都正常工作,那么它就不应该正常工作,但我们都知道,所有的事情都不能正常工作,特别是在查询优化器、查询计划缓存和统计数据方面。

首先,我建议重建索引和统计数据,然后清除查询计划缓存,以确保这不会搞砸。然而,即使这样做了,我也遇到了一些问题。

我曾经经历过一些情况,即左连接比内部连接要快。

其根本原因是:如果您有两个表,并且使用索引(在两个表上)连接到一个列上。内部联接将产生相同的结果,不管您是在表1上的索引中循环条目,还是在表2上匹配索引,就好像您要在表2上对索引中的条目执行反向循环,并在表1中与索引匹配。问题是,当您有误导性统计信息时,查询优化器将使用索引的统计信息来查找匹配项最少的表(基于其他标准)。如果有两个表,每个表有100万行,表1中有10行匹配,在表2中有100000行匹配。最好的方法是对表1进行索引扫描,并在表2中匹配10次。相反的是一个索引扫描,循环超过100000行,并试图匹配100000次,只有10次成功。因此,如果统计数据不正确,优化器可能会选择错误的表和索引来循环。

如果优化器选择按编写的顺序优化左联接,那么它的性能将优于内部连接。

但是,优化器也可以将左连接优化为左半连接。要使它选择您想要的,您可以使用强制命令提示。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 1040 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信