У меня есть скалярная функция с именем 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 вы можете найти скрипт.sql, который может воспроизвести то, о чем я говорю, и вы также можете найти Trace.trc из моего SQL Server Profiler.
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))
RowCounts = 6
SELECT DBO.DATEONLY(INCOMING) AS DATA, COUNT(*) AS SOULS
FROM HELL
GROUP BY DBO.DATEONLY(INCOMING)
RowCounts = 32
В моем реальном сценарииэти 32 строки превращаются в миллионы RowCounts.Если они такие же, что происходит ?!Как я могу оптимизировать это, чтобы предотвратить изменение всего моего приложения?
Большое спасибо!