IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[SQL2019] Temps de compilation étrange


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Points : 71
    Points
    71
    Par défaut [SQL2019] Temps de compilation étrange
    Bonjour à tous,

    J'ai développé une fonction SQL il y a quelques années sous SQL 2012 qui fonctionnait très bien sur plusieurs versions.

    J'ai constaté qu'avec SQL 2019 le temps d'exécution a explosé avec SQL 2019.
    Temps d'analyse et de compilation de SQL Server :
    , Temps UC = 0*ms, temps écoulé = 0*ms.
    Temps d'analyse et de compilation de SQL Server :
    , Temps UC = 12719*ms, temps écoulé = 12846*ms.
    Temps d'analyse et de compilation de SQL Server :
    , Temps UC = 0*ms, temps écoulé = 1*ms.

    Si je descends le niveau de compatibilité de la base à 140, je retrouve des temps normaux.

    Avez-vous déjà rencontré ce genre de soucis sur cette version de SQL Server ?

    Voici la version de ma base : Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)

    la fonction ne fait pas grand chose (des DATEADD et quelques SUBSTRING).

    J'ai aussi essayé de remplacer la fonction par un bloc BEGIN END, mais ça fait disparaitre le soucis.

    Merci de votre aide,
    Seb

    Code de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    ALTER function [dbo].[CalcDateTest](@LaDate datetime2, @Transformation varchar(100))
    returns datetime2
    as
    BEGIN
     
    	DECLARE @Resultat datetime2, @Prefixe varchar(100)=null, @Parametre varchar(10)=null
    	, @Operation varchar(1)=null, @quantite varchar(10)=null --numeric(19,8)
    	if @Transformation='DAT999'
    		RETURN CAST('29991231' as datetime2)
    	SET @Transformation=REPLACE(@Transformation, ' ', '')	
    	-- DATSYS MMSYS DAT999
    	-- JFM J01 PJA DJA
    	SET @Resultat = @Ladate
    	IF CHARINDEX('(', @Transformation, 1)>0
    	BEGIN
    		SET @Prefixe = SUBSTRING(@Transformation, 1, CHARINDEX('(', @Transformation, 1)-1)
    		SET @Parametre = SUBSTRING(@Transformation, CHARINDEX('(', @Transformation, 1)+1, 3)
    	END
    	if @Prefixe='MMSYP'
    	BEGIN
    		SET @Prefixe='MMSYS'
    		SET @Ladate=DATEADD(DAY, -1, @Ladate)
    	END
    	ELSE IF @Prefixe='DATSYP'
    	BEGIN
    		SET @Prefixe='DATSYS'
    		SET @Ladate=DATEADD(DAY, -1, @Ladate)
    	END
    	ELSE IF @Prefixe='WWSYP'
    	BEGIN
    		SET @Prefixe='WWSYS'
    		SET @Ladate=DATEADD(DAY, -1, @Ladate)
    	END
    	IF CHARINDEX('+', @Transformation, 1)>0
    	BEGIN
    		SET @Operation='+'
    	END
    	ELSE IF CHARINDEX('-', @Transformation, 1)>0
    	BEGIN
    		SET @Operation='-'
    	END
    	if @Operation is not null
    	BEGIN
    		SET @Quantite= SUBSTRING( @Transformation
    								, CHARINDEX(@Operation, @Transformation, 1)+1
    								, LEN(@Transformation)-CHARINDEX(@Operation, @Transformation, 1)
    							    )
    		IF @Prefixe is null
    			SET @Prefixe = SUBSTRING(@Transformation, 1, CHARINDEX(@Operation, @Transformation, 1)-1)
    	END
    	IF @quantite is not null
    	BEGIN
    return '01/01/2012'
     
    		DECLARE @Qte int
    		SET @Qte = CAST(@quantite as int)
    		IF @Operation='+'
    		BEGIN
    			IF @Prefixe='MMSYS'
    				SET @LaDate = DATEADD(MONTH, @Qte , @LaDate)
    			ELSE IF @Prefixe='DATSYS'
    				SET @LaDate = DATEADD(DAY, @Qte , @LaDate)
    			ELSE IF @Prefixe = 'WWSYS'
    				SET @LaDate = DATEADD(DAY, @Qte *7, @LaDate)
    			ELSE IF @Prefixe = 'QQSYS'
    				SET @Ladate = DATEADD(MONTH, 3*@Qte , @LaDate)
    			ELSE IF @Prefixe = 'SSSYS'
    				SET @Ladate = DATEADD(MONTH, 6*@Qte , @LaDate)
    		END
    		ELSE IF @Operation='-'
    		BEGIN
    			IF @Prefixe='MMSYS'
    				SET @LaDate = DATEADD(MONTH, -1 * @Qte , @LaDate)
    			ELSE IF @Prefixe='DATSYS'
    				SET @LaDate = DATEADD(DAY, -1 * @Qte , @LaDate)
    			ELSE IF @Prefixe = 'WWSYS'
    				SET @LaDate = DATEADD(DAY, -1*@Qte *7, @LaDate)
    			ELSE IF @Prefixe = 'QQSYS'
    				SET @Ladate = DATEADD(MONTH, -1 * 3*@Qte , @LaDate)
    			ELSE IF @Prefixe = 'SSSYS'
    				SET @Ladate = DATEADD(MONTH, -1 * 6*@Qte , @LaDate)
    		END
    	END
    return @Ladate
     
    	return @Ladate			
    END

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Le temps d'analyse et de compilation n'a rien à voir avec le temps d'exécution.... Une fonction de type scalaire étant incorporée à une requête, le temps d'analyse et de compilation est celui de la requête, pas de la fonction.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Possible que l'incorporation des UDF scalaires est problématique ici. Est-ce que tu as essayé de le désactiver pour voir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = ON/OFF
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE OR ALTER FUNCTION UDF(@Param1 [int])
    RETURNS [int] 
    WITH INLINE = OFF /ON
    ++

  4. #4
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Bonjour à tous,

    Ok Sqlpro, toujours aussi précis ;-)

    Ta proposition a fonctionné mikedavem !

    Mettre WITH INLINE = OFF a résolu le problème.

    je suis allé voir la doc, c'est étrange que le fait qu'elle soit inline donne un tel impact !

    Merci en tout cas, ça me retire une épine du pied.

    Un bon reveillon à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/12/2007, 18h03
  2. Réponses: 4
    Dernier message: 17/11/2007, 10h10
  3. Erreur de compilation étrange
    Par poukill dans le forum C++
    Réponses: 5
    Dernier message: 19/10/2007, 09h55
  4. Problème de compilation étrange !
    Par _SamSoft_ dans le forum C
    Réponses: 1
    Dernier message: 17/08/2007, 21h25
  5. [Compilateur]Temps de compilation et recompilation
    Par afrikha dans le forum Général Java
    Réponses: 12
    Dernier message: 18/11/2005, 08h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo