【问题标题】:Is the Max Function in SQL Server Sargable?SQL Server Sargable 中的 Max 函数是否可行?
【发布时间】:2016-06-27 16:05:44
【问题描述】:

我正在努力提高运行缓慢的 SQL 存储过程的性能。

通常我会尝试优化查询使用的执行计划。我的问题涉及以下 SQL 的 sn-p;这个 SQL 是否可搜索,特别是 Max 函数?

   SELECT MAX(Audit_Date) AS DATE,
          FK_RegisterID
     FROM dbo.[Audit Result Entry Detail]
    INNER 
     JOIN dbo.[Audit Register]
       ON dbo.[Audit Result Entry Detail].FK_RegisterID = dbo.[Audit Register].PK_ID
    WHERE ((SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, Audit_Date))) >= @StartDate 
      AND  (SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, Audit_Date))) <= @EndDate)
      AND part_number IN (@ParticipantNumber)
    GROUP 
       BY FK_RegisterID

任何帮助将不胜感激。

【问题讨论】:

  • Sargable 适用于过滤器。例如 WHERE 子句,在您的情况下是不可分割的。不是聚合。
  • 我将首先将您的 WHERE 子句更改为 Audit_Date &gt;= @StartDate AND Audit_Date &lt; DATEADD(dd,1,@EndDate) 之类的内容,这样您就可以从 Audit_Date 上的索引或 Audit_date, part_number 上的复合索引中受益。
  • 您可以在DATEADD 附近丢失内部Select - 没有必要,如果您使用的是 SQL Management Studio,那么我建议您使用 Include Actual Execution Plan from 查询菜单。这将为您提供很好的信息来修改您的查询并显示您是否缺少索引。

标签: sql sql-server performance optimization


【解决方案1】:

感谢他们提供的所有帮助。我在网上找到了这个,它也帮助我了解了如何让我的 SQL 查询更可搜索。

使 SQL 查询不可分割的典型情况是 在 WHERE 子句中包含对列值进行操作的函数。 WHERE 子句不是唯一重要的可搜索性子句。 它还可以对 ORDER BY、GROUP BY 和 HAVING 子句产生影响。

另一方面,SELECT 子句可以包含 non-sargable 不会对性能产生不利影响的表达式。

【讨论】:

  • 是的 - 这就是@DStanley 的 cmets 的意义所在,尽管我听说(未经测试)SQL Server 现在在内部自动重新排列这些方面要好得多
猜你喜欢
  • 2018-12-14
  • 2015-03-19
  • 2011-03-06
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多