J'ai une fonction scalaire à valeur appelée DATEONLY qui retourne DATEADD (DD, 0, DATEDIFF (DD, 0, @DATETIME)), comme ceci:SQL Server me montre différentes rowcounts en utilisant les fonctions Valued Scalar-
CREATE FUNCTION [DBO].[DATEONLY] (@DATETIME DATETIME)
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, 0, DATEDIFF(DD, 0, @DATETIME))
END
Lorsque je sélectionne une table à l'aide de ma fonction, le SQL Server Profiler compte un nombre élevé de RowCounts que si j'ai utilisé directement DATEADD (DD, 0, DATEDIFF (DD, 0, @DATETIME)).
Dans mon dossier public Dropbox, vous pouvez trouver un script.sql qui peut reproduire ce dont je parle et vous pouvez également trouver un Trace.trc à partir de mon profileur SQL Server.
script.sql: https://www.dropbox.com/s/gwbh54jqas7fhhc/script.sql
trace.trc: https://www.dropbox.com/s/gwbh54jqas7fhhc/Trace.trc
Juste pour simplifier, regardez les rowcounts ci-dessous.
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
Dans mon scénario réel, ces 32 lignes se transforme en rowcounts de millions. S'ils sont LA MÊME CHOSE, que se passe-t-il ?! Comment puis-je optimiser cela pour éviter de changer toute l'application?
Merci beaucoup!