我有一些存储过程有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
....
无效。
答案 0 :(得分:2)
如果您可以在查询之外调用函数,它将最大限度地降低函数阻止可能发生的任何预编译的风险,例如在视图中,因为将为每条记录评估函数。
如果功能复杂或耗时,事先运行一次可能会提高性能。
在您的示例中,您将拥有没有函数调用的视图,然后使用视图(例如存储过程)评估SQL中的函数。
答案 1 :(得分:1)
您可以在任意位置调用它们,如果它是一个始终返回相同值的字段,例如GETDATE()
,则将其放入变量并限制数据库调用的数量。
显然,如果函数的结果是可变的,这取决于函数的输入,那么将它保留在select / where中。
在一天结束时,它将归结为执行时间,如果您正在迭代一组100条记录,那么任何一种方法之间的性能差异都不值得担心。如果它超过1亿条记录,那么优化将是一个考虑因素。