次のように、DATEADD(DD,0, DATEDIFF(DD,0, @DATETIME)) を返す DATEONLY というスカラー値関数があります。
CREATE FUNCTION [DBO].[DATEONLY] ( @DATETIME DATETIME )
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, 0, DATEDIFF(DD, 0, @DATETIME))
END
関数を使用してテーブルを選択すると、SQL Server プロファイラーは、直接 DATEADD(DD,0, DATEDIFF(DD,0, @DATETIME)) を使用した場合よりも高い RowCounts 数をカウントします。
私の Dropxbox の Public Folder には、私が話していることを再現できる 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 行は数百万の RowCount になります。それらが同じものである場合、何が起こっているのですか?! アプリケーション全体を変更しないように最適化するにはどうすればよいですか?
どうもありがとう!