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 :

Aide pour réécrire une requête [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut Aide pour réécrire une requête
    Bonjour,
    J'ai créé une requête SQL qui ne fonctionne malheureusement pas.
    je penses que je l'ai mal écrite..
    Y aurait il une âme charitable qui pourrait m'aider à reconstruire 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
     
     
    DECLARE @EVENT_TYPE_SORTING   Int = 2  -- Tri
    DECLARE @EVENT_TYPE_REJECT     Int = 34 -- Rejet
     
    DECLARE @StartDateTime DateTime = '20180613 04:30:00'
    DECLARE @EndDateTime DateTime =   '20180614 13:30:00'
     
     
    SELECT 
    Parcel.[Id] as id,
    Tache.Num as TacheTri,
    Chute.Num as num,
    dsc.SortingType as type,
    IDT13.[Barcode] as Cab_Suivi,
    IDT24.[Barcode] as Cab_Pch,
    IDT28.[Barcode] as Cab_Geolabel,
    Parcel.[PostalCodeAcqMode] as Acquisition_PostalCode,
    FROM [Chute] 
     
    Left outer join  
     
    (Vacation
               JOIN Parcel
                    ON (Vacation.Debut BETWEEN @StartDateTime AND @EndDateTime OR 
                        Vacation.Fin BETWEEN @StartDateTime AND @EndDateTime) AND
                          Vacation.Id=Parcel.VacationId
               JOIN ParcelEvent
               ON Parcel.Id=ParcelEvent.ParcelId AND 
                  ParcelEvent.EventTypeNum IN (@EVENT_TYPE_SORTING,@EVENT_TYPE_REJECT) AND
                          ParcelEvent.[DateTime] BETWEEN @StartDateTime AND @EndDateTime
     
    Left outer join [Barcode] as IDT13 with(nolock) 
    on IDT13.[ParcelId] = Parcel.[Id] and len(IDT13.[Barcode])='13' 
    Left outer join [Barcode] as IDT24 with(nolock) 
    on IDT24.[ParcelId] = Parcel.[Id] and len(IDT24.[Barcode])='24'
    Left outer join [Barcode] as IDT28 with(nolock) 
    on IDT28.[ParcelId] = Parcel.[Id] and len(IDT28.[Barcode])='28')
     
     
    ON Chute.Num =Parcel.PhysicalChuteNum 
     
    left join dsc
    on dsc.chute=chute.num and dsc.Idtache=Vacation.idtache
     
    join tache
    on tache.id= dsc.IdTache

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Elle ne fonctionne pas, c'est à dire ?
    Un message d'erreur ? lequel ?
    Un résultat inattendu ? quel résultat ? lequel est souhaité ?

  3. #3
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    essayez de mettre un alias pour la sous requête en table dérivée.

    sinon... avec le message d'erreur, ce serait plus pratique....

  4. #4
    Membre régulier
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 82
    Points
    82
    Par défaut
    Amha il manque le select et le from dans la sous requête

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par III Jonathan III Voir le message
    Amha il manque le select et le from dans la sous requête
    Exact bien vu , et aussi, le prédicat de jointure avec la table dérivée, porte non pas sur l'alias (manquant) de la table dérivée, mais sur l'une des tables concourant à la construction de cette table dérivée (en l'occurrence "parcelle")

  6. #6
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    en relisant, ce n'est en fait pas une sous requête, mais des jointures imbriquées.


    Il paraitrait logique de mettre une jointure externe pour la table tache, puisqu'elle est jointe sur une table elle même en jointure externe.

    quel est le message d'erreur ?

  7. #7
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour tout le monde,
    ce n'est pas une sous requête mais bien des jointures imbriquées
    je n'aie pas de message d'erreur ; la requête mouline sans jamais me donner de résultat.
    A l'origine ma requete n'avait pas le bout de code suivant et elle fonctionnait trés bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Left outer join [Barcode] as IDT13 with(nolock) 
    on IDT13.[ParcelId] = Parcel.[Id] and len(IDT13.[Barcode])='13' 
    Left outer join [Barcode] as IDT24 with(nolock) 
    on IDT24.[ParcelId] = Parcel.[Id] and len(IDT24.[Barcode])='24'
    Left outer join [Barcode] as IDT28 with(nolock) 
    on IDT28.[ParcelId] = Parcel.[Id] and len(IDT28.[Barcode])='28')


    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
    DECLARE @EVENT_TYPE_SORTING   Int = 2  -- Tri
    DECLARE @EVENT_TYPE_REJECT     Int = 34 -- Rejet
     
    DECLARE @StartDateTime DateTime = '20180613 04:30:00'
    DECLARE @EndDateTime DateTime =   '20180614 13:30:00'
     
     
    SELECT 
    Parcel.[Id] as id,
    Tache.Num as TacheTri,
    Chute.Num as num,
    dsc.SortingType as type,
    --IDT13.[Barcode] as Cab_Suivi,
    --IDT24.[Barcode] as Cab_Pch,
    --IDT28.[Barcode] as Cab_Geolabel,
    Parcel.[PostalCodeAcqMode] as Acquisition_PostalCode
    FROM [Chute] 
     
    Left outer join  
     
    (Vacation
               JOIN Parcel
                    ON (Vacation.Debut BETWEEN @StartDateTime AND @EndDateTime OR 
                        Vacation.Fin BETWEEN @StartDateTime AND @EndDateTime) AND
                          Vacation.Id=Parcel.VacationId
               JOIN ParcelEvent
               ON Parcel.Id=ParcelEvent.ParcelId AND 
                  ParcelEvent.EventTypeNum IN (@EVENT_TYPE_SORTING,@EVENT_TYPE_REJECT) AND
                          ParcelEvent.[DateTime] BETWEEN @StartDateTime AND @EndDateTime)
     
    /*Left outer join [Barcode] as IDT13 with(nolock) 
    on IDT13.[ParcelId] = Parcel.[Id] and len(IDT13.[Barcode])='13' 
    Left outer join [Barcode] as IDT24 with(nolock) 
    on IDT24.[ParcelId] = Parcel.[Id] and len(IDT24.[Barcode])='24'
    Left outer join [Barcode] as IDT28 with(nolock) 
    on IDT28.[ParcelId] = Parcel.[Id] and len(IDT28.[Barcode])='28')*/
     
     
     
    ON Chute.Num =Parcel.PhysicalChuteNum 
     
    left join dsc
    on dsc.chute=chute.num and dsc.Idtache=Vacation.idtache
     
    join tache
    on tache.id= dsc.IdTache

    Lorsque j'ai rajouter ces lignes, elle mouline sans jamais me donner de résultat

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Pour information votre requête est mathématiquement fausse d'un point de vu de gestion des intervalles de temps.

    En effet quand l'on veut "matcher" des intervalles avec des valeurs il faut choisir de gérer ces intervalles soit :
    OUVERT à gauche, FERMÉ à droite [ ... [
    FERMÉ à gauche, OUVERT à droite [ ... [
    Or l'opérateur BETWEEN travaille avec un intervalle OUVERT à droite et OUVERT à gauche ] ... [ (les bornes étant toutes les deux incluses). Vous aurez donc des intersections temporelles et non des continuités temporelles...

    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/ * * * * *

  9. #9
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour sql pro
    J'ai du mal à comprendre ..
    L'opérateur between fonctionnait bien avant que je rajoute les ligne de codes avec les tables TD132,ID24 et ID28

  10. #10
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    En supposant que chacune des jointures avec BarCode ne retourne qu'au plus une seule ligne, alors vous pouvez ecrire 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
     
    DECLARE @EVENT_TYPE_SORTING INT= 2;  -- Tri
    DECLARE @EVENT_TYPE_REJECT INT= 34; -- Rejet
     
    DECLARE @StartDateTime DATETIME= '20180613 04:30:00';
    DECLARE @EndDateTime DATETIME= '20180614 13:30:00';
     
     
    SELECT Parcel.[Id] AS id,
           Tache.Num AS TacheTri,
           Chute.Num AS num,
           dsc.SortingType AS type,
    	   Cab_Suivi,
    	   Cab_Pch,
    	   Cab_Geolabel,
           Parcel.[PostalCodeAcqMode] AS Acquisition_PostalCode
    FROM [Chute]
         LEFT OUTER JOIN Vacation
                         JOIN Parcel ON(Vacation.Debut BETWEEN @StartDateTime AND @EndDateTime
                                        OR Vacation.Fin BETWEEN @StartDateTime AND @EndDateTime)
                                       AND Vacation.Id = Parcel.VacationId
                         JOIN ParcelEvent ON Parcel.Id = ParcelEvent.ParcelId
                                             AND ParcelEvent.EventTypeNum IN(@EVENT_TYPE_SORTING, @EVENT_TYPE_REJECT)
                                             AND ParcelEvent.[DateTime] BETWEEN @StartDateTime AND @EndDateTime
        LEFT JOIN (
    		  SELECT 
    				BarCode.ParcelId
    			 ,	MAX(CASE WHEN LEN(BarCode.Barcode) = 13 THEN BarCode END ) AS Cab_Suivi
    			 ,	MAX(CASE WHEN LEN(BarCode.Barcode) = 24 THEN BarCode END ) AS Cab_Pch
    			 ,	MAX(CASE WHEN LEN(BarCode.Barcode) = 28 THEN BarCode END ) AS Cab_Geolabel
    		  FROM 	BarCode 
    		  WHERE LEN(BarCode.Barcode) IN (13, 24, 28)
    		  GROUP BY BarCode.ParcelId
        ) AS BC
    		 ON BC.ParcelId = Parcel.[Id]
        ON Chute.Num = Parcel.PhysicalChuteNum
    LEFT JOIN dsc ON dsc.chute = chute.num
                          AND dsc.Idtache = Vacation.idtache
    JOIN tache ON tache.id = dsc.IdTache;

  11. #11
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Sql pro

    dans ma requete
    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
    DECLARE @EVENT_TYPE_SORTING   Int = 2  -- Tri
    DECLARE @EVENT_TYPE_REJECT     Int = 34 -- Rejet
     
    DECLARE @StartDateTime DateTime = '20180613 04:30:00'
    DECLARE @EndDateTime DateTime =   '20180614 13:30:00'
     
     
    SELECT 
    Parcel.[Id] as id,
    Tache.Num as TacheTri,
    Chute.Num as num,
    dsc.SortingType as type,
    IDT13.[Barcode] as Cab_Suivi,
    IDT24.[Barcode] as Cab_Pch,
    IDT28.[Barcode] as Cab_Geolabel,
    Parcel.[PostalCodeAcqMode] as Acquisition_PostalCode,
    FROM [Chute] 
     
    Left outer join  
     
    (Vacation
               JOIN Parcel
                    ON (Vacation.Debut BETWEEN @StartDateTime AND @EndDateTime OR 
                        Vacation.Fin BETWEEN @StartDateTime AND @EndDateTime) AND
                          Vacation.Id=Parcel.VacationId
               JOIN ParcelEvent
               ON Parcel.Id=ParcelEvent.ParcelId AND 
                  ParcelEvent.EventTypeNum IN (@EVENT_TYPE_SORTING,@EVENT_TYPE_REJECT) AND
                          ParcelEvent.[DateTime] BETWEEN @StartDateTime AND @EndDateTime
    .......

    j'ai réecrie la ligne de code 29
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ParcelEvent.[DateTime] BETWEEN @StartDateTime AND @EndDateTime
    en remplaçant les variables scalaires @StartDateTime et @EndDateTime par les dates en dure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ParcelEvent.[DateTime] BETWEEN '20180613 04:30:00'  AND '20180614 13:30:00'
    Et ça marche..je ne comprend pas trés bien pourquoi ??

    aieeeuuuuu, ta proposition fonctionne

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Quel est le type de données de vos colonnes Debut et Fin ?

    Ensuite comme dit BETWEEN n'est pas adapté. Vous devez faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debut <= valeur1 AND Fin > valeur2
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debut < valeur1 AND Fin >=  valeur2
    et non ce que fait le BETWEEN à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debut <= valeur1 AND Fin >= valeur2
    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/ * * * * *

  13. #13
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Sql pro
    A la question Quel est le type de données de vos colonnes Debut et Fin ? c'est un format dateTime
    je comprend la subtilité entre le between et les > et >.
    Mais cela ne répond pas la question pour lorsque j'utilise la fonction between avec des dates en dure cela fonctionne ?

  14. #14
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Lorsque vous mettez les valeurs en dur, le moteur utilise ces valeurs pour générer le plan d’exécution (plan optimisé pour ces valeurs précises de dates)

    Lorsque vous utilisez des variables, le moteur cherche à générer un plan qui sera optimal quelles ques soient les valeurs des variables au moment de l’exécution. En effet, la même requête pourrait être réutilisée avec d'autres valeurs pour ces variables et le même plan d'exécution sera utilisé.

    Vous pouvez ajouter des indicateurs en fin de requête pour forcer le moteur à optimiser son plan pour des valeurs particulières pour les variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    OPTION (OPTIMIZE FOR (
    	   @StartDateTime  = '20180613 04:30:00'
        ,   @EndDateTime  =   '20180614 13:30:00'
        )
    )

  15. #15
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    aieuuuuuuuuuuuuuuuu
    formidale cette ligne de code ci dessous. je ne la connaissais pas. elle m'affiche presque instantanément la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OPTION (OPTIMIZE FOR (
    	   @StartDateTime  = '20180312 04:30:00'
        ,   @EndDateTime  =   '20180402 04:30:00'
        )
    )
    Si j'ai bien compris, il faudrait qu j'utilise cette option lorsque mes requêtes demande du temps pour s'afficher ?

  16. #16
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    C'est un peu plus compliqué que ça. en premier lieu, lorsqu'une requête parait trop longue, il faut trouver la raison.

    Il faut être prudent avec les indicateurs et les utiliser uniquement si nécessaire...

  17. #17
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Aieuuu

    Je suis d'accord avec toi lorsque tu dis que lorsqu'une requête met du temps à s’exécuter , il faut trouver la raison.
    J'ai trois questions à te poser lorsque tu écris
    Il faut être prudent avec les indicateurs et les utiliser uniquement si nécessaire...
    1) les indicateurs est ce ta ligne de code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OPTION (OPTIMIZE FOR (
    	   @StartDateTime  = '20180312 04:30:00'
        ,   @EndDateTime  =   '20180402 04:30:00'
        )
    )
    2) A quel moment dois je me dire que les indicateurs sont nécessaires dans une requête SQL ?

    3) Quel est le risque de mettre des indicateurs lorsque cela n 'est pas nécessaire dans une requête SQL ?

  18. #18
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par facteur Voir le message
    1) les indicateurs est ce ta ligne de code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OPTION (OPTIMIZE FOR (
    	   @StartDateTime  = '20180312 04:30:00'
        ,   @EndDateTime  =   '20180402 04:30:00'
        )
    )
    Oui, mais il en existe bien d'autres


    Citation Envoyé par facteur Voir le message
    2) A quel moment dois je me dire que les indicateurs sont nécessaires dans une requête SQL ?
    Je ne sais pas s'il existe vraiment une bonne réponse à cette question...
    si vous avez une requête anormalement longue, que vous identifiez clairement que le plan généré est mauvais et en cause dans la lenteur, et que vous ne ne parvenez pas à obtenir de bon résultats en réécrivant la requête, en indexant, etc,
    bref, quand toutes les techniques d'optimisation n'ont pas abouti, alors les indicateurs peuvent être envisagés. ça reste un palliatif...



    Citation Envoyé par facteur Voir le message
    3) Quel est le risque de mettre des indicateurs lorsque cela n 'est pas nécessaire dans une requête SQL ?
    Le principal risque est que le remède soit pire que le mal.
    Une base de données évolue, parfois rapidement, et il se peut qu'un indicateur soit bénéfique un jour, et néfaste le lendemain... (suite à la modification des cardinalités, création d'indexes,...)
    Il faut donc, en plus d'une utilisation parcimonieuse, réévaluer régulièrement la pertinence des indicateurs utilisés.
    Afin de faciliter la maintenance, il peut être préférable d'utiliser des repères de plan plutôt que de mettre les indicateurs directement dans les requêtes.

  19. #19
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Merci pour ces indications aieuuuu
    très très intéressant..
    Je clôture cette discussion

  20. #20
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour aieuuuuuuuuuuuuu
    je réouvre cette discussion car je souhaiterais modifier momentanément un morceau de ma requête( du moins la tienne de reqête lol).
    Ci dessous, le bout de ta requête que je souhaiterais changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    				BarCode.ParcelId
    			 ,	MAX(CASE WHEN LEN(BarCode.Barcode) = 13 THEN BarCode END ) AS Cab_Suivi
    			 ,	MAX(CASE WHEN LEN(BarCode.Barcode) = 24 THEN BarCode END ) AS Cab_Pch
    			 ,	MAX(CASE WHEN LEN(BarCode.Barcode) = 28 THEN BarCode END ) AS Cab_Geolabel
    		  FROM 	BarCode 
    		  WHERE LEN(BarCode.Barcode) IN (13, 24, 28)
    		  GROUP BY BarCode.ParcelId
    je voudrais obtenir, les champs pour lequels:
    les lignes (BarCode.Barcode) = 13 soit null
    les lignes (BarCode.Barcode) = 24 soit null
    les lignes (BarCode.Barcode) = 28 soit null

    Merci d'avance aieuuu

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SQL] aide pour construire une requête
    Par mealtone dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/08/2006, 15h16
  2. besoin d 'aide pour formuler une requête
    Par cdu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/04/2006, 19h38
  3. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  4. [Access 2000] Aide pour finir une requête
    Par Tankian dans le forum Access
    Réponses: 4
    Dernier message: 21/12/2005, 19h53
  5. Aide pour écrire une requête complexe
    Par julienbdx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/11/2005, 16h58

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