哈希匹配溢出

sql*_*ana 3 performance sql-server optimization execution-plan sql-server-2017 query-performance

我在这里发生了哈希匹配溢出。我已经用 FULLSCAN 更新了涉及的表的统计信息,所以不是这样。任何指针都非常感谢。

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

我使用的是 SQL 2017 Enterprise,内存为 64GB。

Eri*_*ing 5

鉴于数据的大小,可能无法完全避免溢出,但您可以做一些事情来改进查询。

  1. 确保您的 join 和 where 子句列是 NC 索引键
  2. 您没有选择很多列,所以不要害怕包含它们以使索引覆盖
  3. 计算行号 ( RN) 会导致相当多的排序和溢出——考虑不同的索引来解决这个问题可能是值得的。请注意,您在此处使用的表达式DATEDIFF(day,s.COMPLETEDDATE,att.atd_date, 也用于...

坚果

...您为actual_day_difference( AND a.actual_day_difference BETWEEN -60 AND 90)获得的非 SARGable 谓词,它消除了从 ~5mm 到 ~400k 的行。相当大的减少可能有助于早期查询。

问题是DATEDIFF(day,s.COMPLETEDDATE,att.atd_date)必须生成整个结果集,然后过滤掉。像在 CTE、派生表或未索引的视图中那样粘贴计算不会持久化它们。在此处查看我的问答:两个日期列的 SARGable WHERE 子句

在此处输入图片说明

我不确定attendand之间是否存在关系Study,但使用临时表或索引视图来具体化表达式以使其成为 SARGable 可能是值得的。您还可以探索向保存相应日期数据的任一表添加和填充附加列。

这也将开拓更多的索引选项给你,并兑现的能力ABSDATEDIFF必要时也是如此。

由于这是针对 SQL Server 2014 的,因此可能值得探索非聚集列存储索引,这可能会减少尝试找出合适的行存储索引的痛苦,并且更适合像这样的更大的 DW 样式查询。

希望这可以帮助!