USE master; GO -- création de la base de tests CREATE DATABASE DB_TESTS_UDF; GO -- rétrogradation d ela base en version 2008 ALTER DATABASE DB_TESTS_UDF SET COMPATIBILITY_LEVEL = 100; GO --> vous pouvez opter pour la version : -- 2012 (110), -- 2014 (120), -- 2016 (130) -- 2017(140) -- mais pas la version 2019.... ! -- on se place dans le contexte de la base de test USE DB_TESTS_UDF; GO -- création de la fonction (UDF) de conversion de DATETIME2 en DATE CREATE FUNCTION dbo.F_DATETIME2_TO_DATE (@DATETIME DATETIME2) RETURNS DATE AS BEGIN RETURN CAST(@DATETIME AS DATE); END GO -- création d'une table contenant une colonne de type DATETIME2 CREATE TABLE T_DATETIME2 (ID INT IDENTITY PRIMARY KEY, DT DATETIME2); GO -- premier remplissage de la table des dates avec 3334 valeurs aléatoires SET NOCOUNT ON; DECLARE @I INT = 1, @DT DATETIME2; WHILE @I < 3334 BEGIN INSERT INTO T_DATETIME2 VALUES (DATEADD(second, ABS(CHECKSUM(NEWID())), '19500101')); SET @I += 1; END; GO -- insertion suppémentaire de 11 millions de lignes ! -- ATTENTION : ça prends du temps (1'22" chez moi) INSERT INTO T_DATETIME2 SELECT DATEADD(millisecond, ABS(CHECKSUM(NEWID())), T1.DT) FROM T_DATETIME2 AS T1 CROSS JOIN T_DATETIME2 AS T2; GO -- test n°1 recherche avec la fonction UDF (F_DATETIME2_TO_DATE) -- rétro version 2008, aucun index dans la table SET STATISTICS TIME ON; GO SELECT * FROM T_DATETIME2 WHERE dbo.F_DATETIME2_TO_DATE(DT) = '2001-09-11'; GO --> aucune importance s'il n'y a aucun résultat... --> RESULTATS (onglet message) : -- Temps d'exécution : Temps UC = 63812 ms, temps écoulé = 73279 ms. -- test n°2 recherche avec le code SQL direct (fonction intégrée CAST) -- rétro version 2008, aucun index dans la table SET STATISTICS TIME ON; GO SELECT * FROM T_DATETIME2 WHERE CAST(DT AS DATE) = ('2001-09-11'); GO --> RESULTAT (onglet message) -- Temps d'exécution : Temps UC = 2296 ms, temps écoulé = 272 ms. --> BILAN : sans la fonction UDF, SQL Server est 269 fois plus rapide ! --> CRÉATION D'UN INDEX sur la colonne DATETIME2 : CREATE INDEX X_DT ON T_DATETIME2 (DT); GO -- test n°3 recherche avec la fonction UDF (F_DATETIME2_TO_DATE) -- rétro version 2008, index X_DT dans la table SET STATISTICS TIME ON; GO SELECT * FROM T_DATETIME2 WHERE dbo.F_DATETIME2_TO_DATE(DT) = '2001-09-11'; GO --> RESULTATS (onglet message) : -- Temps d'exécution : Temps UC = 62406 ms, temps écoulé = 71800 ms. -- test n°4 recherche avec le code SQL direct (fonction intégrée CAST) -- rétro version 2008, index DT dans la table SET STATISTICS TIME ON; GO SELECT * FROM T_DATETIME2 WHERE CAST(DT AS DATE) = ('2001-09-11'); GO --> RESULTAT (onglet message) -- Temps d'exécution : Temps UC = 0 ms, temps écoulé = 0 ms. --> BILAN : sans la fonction UDF, SQL Server est infiniment plus rapide ! ------------------------------------------------------------------------------- --> comportement correcteur avec la version 2019 ------------------------------------------------------------------------------- ALTER DATABASE DB_TESTS_UDF SET COMPATIBILITY_LEVEL = 150; GO -- test n°5 recherche avec la fonction UDF (F_DATETIME2_TO_DATE) -- version 2019, index X_DT dans la table SET STATISTICS TIME ON; GO SELECT * FROM T_DATETIME2 WHERE dbo.F_DATETIME2_TO_DATE(DT) = '2001-09-11'; GO --> RESULTAT (onglet message) -- Temps UC = 2297 ms, temps écoulé = 247 ms. --> BILAN : malgré la fonction UDF, SQL Server a mis exactement le même temps que la fonction intégrée CAST mais n'utilise pas l'index...