什么时候可以调用SELECT中的函数?

时间:2011-12-08 11:18:13

标签: sql-server sql-server-2005

我有一些存储过程有WHERE这样的子句:

WHERE
    dbo.Users.DatePaidUpTo > GETDATE()

这可以吗?这会更有效:

DECLARE @currentDate DateTime
SET @currentDate = GETDATE()

    ....

WHERE
    dbo.Users.DatePaidUpTo > @currentDate

如果效率更高,我该如何为视图做类似的事情?正如这句语法:

ALTER VIEW [dbo].[vw_Recommendations]
AS

DECLARE @currentDate DateTime
SET @currentDate = GETDATE()

SELECT
    ....

无效。

2 个答案:

答案 0 :(得分:2)

如果您可以在查询之外调用函数,它将最大限度地降低函数阻止可能发生的任何预编译的风险,例如在视图中,因为将为每条记录评估函数。

如果功能复杂或耗时,事先运行一次可能会提高性能。

在您的示例中,您将拥有没有函数调用的视图,然后使用视图(例如存储过程)评估SQL中的函数。

答案 1 :(得分:1)

您可以在任意位置调用它们,如果它是一个始终返回相同值的字段,例如GETDATE(),则将其放入变量并限制数据库调用的数量。

显然,如果函数的结果是可变的,这取决于函数的输入,那么将它保留在select / where中。

在一天结束时,它将归结为执行时间,如果您正在迭代一组100条记录,那么任何一种方法之间的性能差异都不值得担心。如果它超过1亿条记录,那么优化将是一个考虑因素。