我有一个名为 DATEONLY 的标量值函数,它返回 DATEADD(DD,0, DATEDIFF(DD,0, @DATETIME)),就像这样:
CREATE FUNCTION [DBO].[DATEONLY] ( @DATETIME DATETIME )
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, 0, DATEDIFF(DD, 0, @DATETIME))
END
当我使用我的函数选择一个表时,SQL Server Profiler 计算的 RowCounts 数比我直接使用 DATEADD(DD,0, DATEDIFF(DD,0, @DATETIME)) 时高。
在我的 Dropxbox 的公共文件夹中,您可以找到一个 script.sql,它可以重现我正在谈论的内容,您还可以从我的 SQL Server Profiler 中找到一个 Trace.trc。
script.sql:https ://www.dropbox.com/s/gwbh54jqas7fhhc/script.sql
trace.trc:https ://www.dropbox.com/s/gwbh54jqas7fhhc/Trace.trc
为简化起见,请查看下面的 RowCounts。
SELECT DATEADD(DD,0, DATEDIFF(DD,0, INCOMING)) AS DATA, COUNT(*) AS SOULS
FROM HELL
GROUP BY DATEADD(DD,0, DATEDIFF(DD,0, INCOMING))
行数 = 6
SELECT DBO.DATEONLY(INCOMING) AS DATA, COUNT(*) AS SOULS
FROM HELL
GROUP BY DBO.DATEONLY(INCOMING)
行数 = 32
在我的真实场景中,这 32 行变成了数百万行计数。如果他们是同一件事,发生了什么?!我如何优化它以防止更改我的整个应用程序?
非常感谢!