Sql server 如何提高where子句或join中列的非确定性函数的性能?

Sql server 如何提高where子句或join中列的非确定性函数的性能?,sql-server,performance,sql-server-2005,join,where-clause,Sql Server,Performance,Sql Server 2005,Join,Where Clause,我想提高查询的性能,它确实有一个带有非确定性函数调用的where子句 Select Count(*) From table1 Where DateDiff(month, Cast(table1.Date As DateTime), GetDate()) = 0 我认为这个问题同样适用于以下情况: Select table1.column1 From table1 Inner Join table2 On table1.MonthOfHappyness = DateDiff(month,

我想提高查询的性能,它确实有一个带有非确定性函数调用的where子句

Select Count(*) 
From table1
Where DateDiff(month, Cast(table1.Date As DateTime), GetDate()) = 0
我认为这个问题同样适用于以下情况:

Select table1.column1
From table1 Inner Join table2 
On table1.MonthOfHappyness = 
DateDiff(month, Cast(table2.SomeDate As DateTime), GetDate()) 

DateDiff(month, Cast(adrPkt.PktRevDato As DateTime), GetDate()) 
是不确定的,我无法创建具有计算列的视图并为其编制索引。 见:


我需要哪些选项来提高性能?

除了非确定性函数之外,我看到的问题是您在字段上进行计算。这(通常)会使查询无法使用字段上的任何索引

此链接的第二段()提供了更详细的信息,说明了何时发生这种情况,如何避免这种情况,以及有时优化器如何在使用函数的情况下使用索引

简言之,不依赖改进的优化器,通常可以通过保持字段完整(不对其进行任何计算),而是对其他值进行(反向)计算来更改查询。在您的情况下,返回由
GetDate()
提供的当前日期。然后查询可以使用字段
table1.Date
的索引

因此,您可以使用以下内容:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date
      BETWEEN
             /* First Day of Current Month */
          AND 
             /* Last Day of Current Month */
你只需要找到能让你在当月的第一天和最后一天到达的函数

这篇博文可以帮助你:

更好的是,这个问题/答案:

我必须进行测试,但我认为上面的细微变化可以:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date 
      >=      /* First Day of Current Month */
        DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0) 
  AND table1.Date 
      <       /* First Day of Next Month */
        DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0) 
选择计数(*)
来自表1
表1.日期
>=/*当月第一天*/
DATEADD(mm,DATEDIFF(mm,0,GetDate()),0)
表1.日期
您是否尝试使用来首先插入所有必需的记录?最后,在临时表上进行计算并返回。

谢谢!在我看来,这种解决问题的方法(通过反转函数来隔离列(可以对其进行索引))的原理很好。您没有解决cast问题,但是它可以类似地解决。我的where子句的结尾类似于:
where table1.Date=Convert(Varchar,DATEADD(mm,DATEDIFF(mm,0,GetDate())+1,0),126