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 :

Requête paramétrée longue à s'éxecuter [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut Requête paramétrée longue à s'éxecuter
    Bonjour
    J'avais poster eu un temps une aide pour l'exécution d'une requête.

    Pour résumer le problème :

    J'ai une requête sql avec deux paramètres de date "date debut" et "date fin".
    Lorsque ces deux paramètres dates sont référencés avec des dates en dure en format aaddjj hh:mm, la requête s’exécute très rapidement (quelques secondes).
    Mais lorsque ces deux paramètres dates sont référencés avec des variables, la requête mais un temps fou a s'exécuter (10 minutes au lieu de quelques secondes)

    L'idée était d'utiliser l’indicateur "OPTIMIZE FOR".
    j'ai donc inséré cet indicateur dans ma requête (ligne 55) mais rien ne change, elle est toujours longue à s’exécuter.
    J'aurais besoin d'une aide pour comprendre ce qui se passe
    Merci d'avance de votre aide
    voici ma requête SQL


    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
    DECLARE @EVENT_TYPE_SORTING                           Int = 2  -- Tri
    DECLARE @EVENT_TYPE_REJECT                            Int = 34 -- Rejet
     
     
    DECLARE @systemNum int ='0'
     
    DECLARE @StartDateTime DateTime 
    DECLARE @EndDateTime DateTime
     
     
     
    SELECT DISTINCT
     
    D.Sortingtype as type,
    p.Id as IdColis,
    coalesce(IDT13.[Barcode],' ') as Cab_Suivi,
    coalesce(IDT24.[Barcode],' ') as Cab_Pch,
    coalesce(IDT28.[Barcode],' ') as Cab_Geolabel
     
     
      FROM [Parcel] AS P with(nolock)
     
    		    Left outer join [Barcode] as IDT24 with(nolock) on IDT24.[ParcelId] = P.[Id] and len(IDT24.[Barcode])='24' 
                        Left outer join [Barcode] as IDT13 with(nolock) on IDT13.[ParcelId] = P.[Id] and len(IDT13.[Barcode])='13' 
                        Left outer join [Barcode] as IDT28 with(nolock) on IDT28.[ParcelId] = P.[Id] and len(IDT28.[Barcode])='28'
     
    Inner join [ParcelEvent] as PE with(nolock) on PE.[ParcelId] = P.[Id] and PE.EventTypeNum IN(@EVENT_TYPE_SORTING, @EVENT_TYPE_REJECT)
     
    INNER join chute as C
    on C.Num=P.PhysicalChuteNum
     
     
    INNER join Vacation as V
    ON  V.Id=P.VacationId
     
    INNER join tache as T
    on T.Id=V.IdTache
     
     
    INNER JOIN dsc as D
    on D.chute=C.num and D.Idtache=T.id 
     
    WHERE  P.SystemNum=@SystemNum and PE.[DateTime] BETWEEN @StartDateTime AND  @EndDateTime
     
     
    GROUP BY
    D.Sortingtype,
    p.Id,
    coalesce(IDT13.[Barcode],' ') ,
    coalesce(IDT24.[Barcode],' ') ,
    coalesce(IDT28.[Barcode],' ')	
     
     
    OPTION (OPTIMIZE FOR (
    	   @StartDateTime  = '20191127 04:30:00'
        ,   @EndDateTime  =   '20191128 04:30:00'
        )
    )

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Bonjour,

    Juste pour info, quelle est votre version de SQL server ?
    Edit : 2012 c'est dans le titre !

    Pour y voir plus clair il serait utile de donner les plans d’exécution des 2 syntaxes.

    Enfin à tout hasard, essayez OPTION (RECOMPILE)Petit article sympa ici : https://blogs.msdn.microsoft.com/rob...iffing-issues/

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Michel
    Pour répondre à votre question :
    Pour y voir plus clair il serait utile de donner les plans d’exécution des 2 syntaxes.
    malheureusement, je peux pas afficher les plans d'éxécution : je ne suis administrateur des tables " ..

    je vais essayer avec l'option
    OPTION (RECOMPILE)

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Michel
    Meme avec l'option (recompile), la requête met un temps fou a afficher les données

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,


    Pourquoi le DISTINCT ?
    Pourquoi le GROUP BY alors qu'il n'y a pas de fonction d'agrégation ?
    Pourquoi joindre trois fois la table BarCode ?
    Pourquoi joindre la table Chute ?

    Essayez comme ceci :

    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
     
    DECLARE @EVENT_TYPE_SORTING                           Int = 2  -- Tri
    DECLARE @EVENT_TYPE_REJECT                            Int = 34 -- Rejet
     
     
    DECLARE @systemNum int ='0'
     
    DECLARE @StartDateTime DateTime 
    DECLARE @EndDateTime DateTime
     
     
     
    SELECT 
    	D.Sortingtype as type,
    	p.Id as IdColis,
    	MAX(CASE WHEN len(IDT24.[Barcode]) = 13 THEN IDT24.[Barcode] ELSE ' ' END ) as Cab_Suivi,
    	MAX(CASE WHEN len(IDT24.[Barcode]) = 24 THEN IDT24.[Barcode] ELSE ' ' END ) as Cab_Pch,
    	MAX(CASE WHEN len(IDT24.[Barcode]) = 28 THEN IDT24.[Barcode] ELSE ' ' END ) as Cab_Geolabel
     
    FROM [Parcel] AS P with(nolock)
    		    Left outer join [Barcode] as IDT24 with(nolock) 
    					on IDT24.[ParcelId] = P.[Id] 
    					and len(IDT24.[Barcode]) in (24, 13,28) 
     
    Inner join [ParcelEvent] as PE with(nolock) on PE.[ParcelId] = P.[Id] and PE.EventTypeNum IN(@EVENT_TYPE_SORTING, @EVENT_TYPE_REJECT)
     
    INNER join Vacation as V
    ON  V.Id=P.VacationId
     
    INNER join tache as T
    on T.Id=V.IdTache
     
     
    INNER JOIN dsc as D
    on D.chute=P.PhysicalChuteNum
      and D.Idtache=T.id 
     
    WHERE  P.SystemNum=@SystemNum and PE.[DateTime] BETWEEN @StartDateTime AND  @EndDateTime
     
     
    GROUP BY
    	D.Sortingtype,
    	p.Id

    Est-ce que les statistiques sont à jours ?

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Aieuu
    j'ai simplifié ma requete sql en supprimant des tables qui en fin de compte ne servaient à rien dans ma requête ( c'était une ancienne requête que j'ai repris en la modifiant).
    Et j'ai repris ta ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MAX(CASE WHEN len(IDT24.[Barcode]) = 13 THEN IDT24.[Barcode] ELSE ' ' END ) as Cab_Suivi,
    	MAX(CASE WHEN len(IDT24.[Barcode]) = 24 THEN IDT24.[Barcode] ELSE ' ' END ) as Cab_Pch,
    	MAX(CASE WHEN len(IDT24.[Barcode]) = 28 THEN IDT24.[Barcode] ELSE ' ' END ) as Cab_Geolabel
    Et effectivement je passe de 15 minutes d'attente à 1 minutes max..
    c'est pas mal...
    Tu pense que l'option




    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
    SELECT 
    	p.Id as IdColis,
    	MAX(CASE WHEN len(B.[Barcode]) = 13 THEN B.[Barcode] ELSE ' ' END ) as Cab_Suivi,
    	MAX(CASE WHEN len(B.[Barcode]) = 24 THEN B.[Barcode] ELSE ' ' END ) as Cab_Pch,
    	MAX(CASE WHEN len(B.[Barcode]) = 28 THEN B.[Barcode] ELSE ' ' END ) as Cab_Geolabel
     
    FROM [Parcel] AS P with(nolock)
    Left outer join [Barcode] as B with(nolock) 
    on B.[ParcelId] = P.[Id] and len(B.[Barcode]) in (24, 13,28) 
     
    Inner join [ParcelEvent] as PE with(nolock) 
    on PE.[ParcelId] = P.[Id] and PE.EventTypeNum IN(@EVENT_TYPE_SORTING, @EVENT_TYPE_REJECT)
     
     
    WHERE  P.SystemNum=@SystemNum and PE.[DateTime] BETWEEN @StartDateTime AND  @EndDateTime 
     
     
    GROUP BY
     
    p.Id
    Merci Aieeuu


    Une dernière question
    Penses tu que l'indicateur
    OPTION (OPTIMIZE FOR
    serait utile dans mon cas pour encore amélioré le temps d'exécution de la requête

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

Discussions similaires

  1. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  2. Requête paramétrée
    Par lou.souleu dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2005, 05h36
  3. [VB.NET] [ADO.NET] Requête paramétrée
    Par DotNET74 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/03/2005, 08h39
  4. Requête paramétrée qui remplit une DBLookUpComboBox
    Par navis84 dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/12/2004, 21h23
  5. VBA & Requête paramétrée
    Par gripoil dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2004, 09h54

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