【问题标题】:Ridding this query of Hash Match Join?摆脱这个哈希匹配连接查询?
【发布时间】:2018-08-20 04:10:39
【问题描述】:

我有以下查询,大约需要 26 行才能返回 8700 行数据。

SELECT
  R.ClientReferralID,
  R.ClientID,
  C.FirstName,
  C.LastName,
  C.FullName,
  dbo.fnGetLocalDate(R.ReferralDate) as ReferralDate,
  RT.ReferralTypeName,
  R.ReferralTypeOther,
  RT2.ReferredToName,
  R.ReferredToOther,
  R.ReferredByID,
  U.FullName as ReferredBy,
  TS.TimeSpentName,
  R.Notes,
  L.ReferralLocationID,
  L.ReferralLocationName as Location,
  R.ReferralLetterSentID,
  R.ReferralLetterOnFileID,
  dbo.fnGetLocalDate(R.DateCreated) as DateCreated,
  U2.FullName as UserCreated,
  dbo.fnGetLocalDate(R.DateModified) as DateModified,
  U3.FullName as UserModified
 FROM
  ClientReferral R
 INNER JOIN Client C on
  R.ClientID = C.ClientID
 INNER JOIN LookUp.ReferralType RT on 
  R.ReferralTypeID = RT.ReferralTypeID
 INNER JOIN LookUp.ReferredTo RT2 on
  R.ReferredToID = RT2.ReferredToID
 INNER JOIN UserAccount U on
  R.ReferredByID = U.UserAccountID
 INNER JOIN LookUp.TimeSpent TS on
  R.TimeSpentID = TS.TimeSpentID
 INNER JOIN LookUp.ReferralLocation L on 
  R.ReferralLocationID = L.ReferralLocationID
 INNER JOIN UserAccount U2 on 
  R.UserCreated = U2.UserAccountID
 LEFT JOIN UserAccount U3 on 
  R.UserModified = U3.UserAccountID
 WHERE
  (R.ReferralDate >= @StartDate or @StartDate is null) and
  (R.ReferralDate <= @EndDate or @EndDate is null)
 ORDER BY 
  R.DateCreated DESC

执行计划可以在这里查看:

https://www.brentozar.com/pastetheplan/?id=B1A5ji7tf

我看到最昂贵的操作是 65% 的哈希匹配连接。我期待以下指数可以改善这一点,但没有:

CREATE NONCLUSTERED INDEX [Name] ON [dbo].[ClientReferral]
(
    [ClientID] ASC
)

有人知道我可以在这里做什么吗?如果需要一些示例数据,请告诉我。

【问题讨论】:

  • 1) 尝试禁用在Client 扫描中使用的idx 2) 尝试从WHERE 子句中删除OR 部分,再看看执行计划。
  • 您希望通过摆脱这个哈希匹配连接查询获得什么?
  • @IvanStarostin - 与此没有区别。
  • 它还在使用禁用索引吗? “没有区别”是什么意思?你有ReferralDate 的索引吗?
  • @IvanStarostin ,执行计划与执行时间保持不变。

标签: sql-server tsql azure-sql-database


【解决方案1】:

第一次改变

WHERE(R.ReferralDate >= @StartDate 或@StartDate 为空)和(R.ReferralDate

WHERE R.ReferralDate BETWEEN ISNULL(@StartDate,CAST(0 AS datetime2)) AND ISNULL(@EndDate,CAST(999999 AS datetime2))

然后创建一个索引

ClientReferral(ReferralDate, ClientID, ReferralTypeID, ReferredToID, ReferredByID, TmeSpentID, ReferralLocationID, UserCreated, UserModified, DateCreated, DateModified) INCLUDE(ClientReferralID, ReferralTypeOther, ReferredToOther, Notes, ReferralLetterSentID, ReferralLetterOnFileID)

同时显示代码

fnGetLocalDate

【讨论】:

  • 并不总是更快,但值得一试
【解决方案2】:

尝试添加索引

ClientReferral ReferralDate  

或者

ClientReferral ReferralDate, ClientID   
ClientReferral ClientID, ReferralDate 

【讨论】:

  • 不幸的是,执行计划或运行时间没有区别。
猜你喜欢
  • 2013-07-26
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
相关资源
最近更新 更多