使用显式哈希联接的任何含义?

时间:2013-10-09 09:38:53

标签: sql sql-server tsql sql-server-2012

通过使用散列连接,我可以将执行时间从800 ms带到467ms。这是我的疑问:

exec sp_executesql N';With cte as (Select peta_rn = ROW_NUMBER() OVER (ORDER BY  d.LastStatusChangedDateTime  desc )  
                                                , d.DocumentID
                                                , u.Username
                                                , it.Abbreviation AS ITypeAbbreviation
                                                , ig.Abbreviation AS IGroupAbbreviation

                                From Documents d
                                Inner Hash Join Users u on d.UserID = u.UserID Inner Join IGroupes ig on ig.IGroupID = d.IGroupID
                                Inner Hash Join ITypes it on it.ITypeID = d.ITypeID Where 1=1  ) Select cte.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, d.CreatedByAccountID, d.JurisdictionID, 
                        d.LastStatusChangedDateTime as LastStatusChangedDateTime
                        ,  d.IDate, d.InstrumentID, d.DocumentStatusID,cte.IGroupAbbreviation, cte.Username, j.JDAbbreviation, inf.DocumentName,
                       cte.ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation,  ds.Name as DocumentStatusName,
                        ( SELECT CAST(CASE WHEN cte.DocumentID = (
                                SELECT TOP 1 doc.DocumentID
                                FROM  Documents doc
                                WHERE doc.JurisdictionID = d.JurisdictionID
                                        AND doc.DocumentStatusID = d.DocumentStatusID
                                ORDER BY LastStatusChangedDateTime) 
                            THEN 1
                            ELSE 0
                        END AS BIT)
                        ) AS CanChangeStatus ,

                        Upper((Select Top 1 Stuff( (Select ''='' + dbo.GetDocumentNameFromParamsWithPartyType(Business, FirstName, MiddleName, LastName, t.Abbreviation, NameTypeID, pt.Abbreviation, IsGrantor, IsGrantee)  From DocumentNames dn
                                Left Hash Join Titles t
                                    on dn.TitleID = t.TitleID               
                                Left Hash Join PartyTypes pt
                                    On pt.PartyTypeID = dn.PartyTypeID
                                        Where DocumentID = cte.DocumentID
                                            For XML PATH('''')),1,1,''''))) as FlatDocumentName, (SELECT COUNT(*) FROM CTE) AS TotalRecords

                        FROM cte Inner JOin Documents d ON d.DocumentID = cte.DocumentID Left Join DocumentStatuses ds On
                        d.DocumentStatusID = ds.DocumentStatusID Left Join InstrumentFiles inf On cte.DocumentID = inf.DocumentID 
                    Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID Where 1=1 And peta_rn>@7 AND peta_rn<=@8 Order by peta_rn',N'@0 int,@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 int,@8 int',@0=1,@1=5,@2=9,@3=1,@4=5,@5=9,@6=1,@7=97450,@8=97500

我想知道在结果集中使用哈希联接是否有任何影响?它看起来不错,但我不确定它是否会破坏我现有的应用程序。

1 个答案:

答案 0 :(得分:4)

这会“破坏你的应用”吗?几乎肯定不会,除非强迫HASH JOIN命中数据库引擎中的某个特定错误,而你的其他执行计划没有命中,但实际上发生这种情况的可能性几乎为零。主要问题是,无论是否有提示,数据是否相同,答案几乎肯定是“是”。

MERGEHASH等联接是物理操作,因此您在执行查询时强制执行特定的物理操作。孤立地,这使得上述查询在这一个实例中运行得更快,但是还有更大的后果需要考虑。例如,HASH JOIN将构建临时哈希表,这些哈希表可能必须存储在tempdb中,因此会增加该区域中的资源使用量。这是否会为其他运营创造新的瓶颈?在你执行更多的测试之前不可能说。

最后,应用这样的提示将您锁定到特定的连接类型。你真的可以说你已经做了绝对的一切来帮助SQL Server在没有提示的情况下做出正确的选择吗?现在,SQL Server正在根据当前表统计信息和您传入的输入参数构建计划。如果您重建统计信息或传递不同的参数并强制执行新计划,您可能会得到不同的结果,但提示您重新承担在一个实例中似乎有用的东西将来适用于所有实例的风险。

这是否意味着您不应该使用提示?不,如果你真的认为这会改善你的系统,那就去吧!只考虑更大的图片 - 使用这样的提示肯定会产生影响,但如果奖励(更快的查询)值得,那么它可能是一个不错的选择。