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

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


HUX布斯
浏览 1041回答 3
3回答

ibeautiful

如果一切都正常工作,那么它就不应该正常工作,但我们都知道,所有的事情都不能正常工作,特别是在查询优化器、查询计划缓存和统计数据方面。首先,我建议重建索引和统计数据,然后清除查询计划缓存,以确保这不会搞砸。然而,即使这样做了,我也遇到了一些问题。我曾经经历过一些情况,即左连接比内部连接要快。其根本原因是:如果您有两个表,并且使用索引(在两个表上)连接到一个列上。内部联接将产生相同的结果,不管您是在表1上的索引中循环条目,还是在表2上匹配索引,就好像您要在表2上对索引中的条目执行反向循环,并在表1中与索引匹配。问题是,当您有误导性统计信息时,查询优化器将使用索引的统计信息来查找匹配项最少的表(基于其他标准)。如果有两个表,每个表有100万行,表1中有10行匹配,在表2中有100000行匹配。最好的方法是对表1进行索引扫描,并在表2中匹配10次。相反的是一个索引扫描,循环超过100000行,并试图匹配100000次,只有10次成功。因此,如果统计数据不正确,优化器可能会选择错误的表和索引来循环。如果优化器选择按编写的顺序优化左联接,那么它的性能将优于内部连接。但是,优化器也可以将左连接优化为左半连接。要使它选择您想要的,您可以使用强制命令提示。
打开App,查看更多内容
随时随地看视频慕课网APP