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 :

Votre avis sur deux requètes SQL


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    dev
    Inscrit en
    Mai 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mai 2005
    Messages : 33
    Par défaut Votre avis sur deux requètes SQL
    Bonjour,
    j'aimerai voir votre avis , sur ces deux query laquelle des deux vous semble la mieux écrite, plus performante.

    QUERY 1

    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
    UPDATE N2 
           SET    N2.tsCreated = COALESCE((SELECT MIN(R1.dateInserted) 
                                                          FROM dbo.SrcRecipient R1 
                                                                WHERE R1.iRecipientIdProd = N2.iRecipientId),N2.tsCreated)
     
                    ,N2.tsLastModified = CASE WHEN N2.tsLastModified > (SELECT MAX(R2.dateModified) 
                                                                FROM dbo.SrcRecipient R2
                                                                       WHERE R2.iRecipientIdProd = N2.iRecipientId) 
     
                                                   THEN N2.tsLastModified
                                                   ELSE 
                                                   COALESCE((SELECT MAX(R3.dateModified) 
                                                                FROM dbo.SrcRecipient R3
                                                                       WHERE R3.iRecipientIdProd = N2.iRecipientId),N2.tsLastModified) 
                                            END
    FROM neolane.NmsRecipient N2
           WHERE N2.iCUS_PRINCIPAL = 0


    --------------------------------------------------------------------------------------------
    QUERY 2

    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
          UPDATE    N2
           SET tsCreated   = COALESCE(R1.dateInserted,N2.tsCreated)
           ,N2.tsLastModified  = CASE WHEN N2.tsLastModified > R2.dateModified 
                                                                THEN N2.tsLastModified
                                                          ELSE COALESCE(R2.dateModified,N2.tsLastModified) 
                                               END 
    FROM   neolane.NmsRecipient N2
                 INNER JOIN 
                        (      SELECT iRecipientIdProd, MIN(dateInserted) dateInserted
                               FROM dbo.SrcRecipient 
                               GROUP BY iRecipientIdProd
                        ) R1
                        ON R1.iRecipientIdProd = N2.iRecipientId
                 INNER JOIN 
                        (      SELECT MAX(dateModified) dateModified, iRecipientIdProd
                               FROM dbo.SrcRecipient
                               GROUP BY iRecipientIdProd
                        ) R2
                        ON R2.iRecipientIdProd = N2.iRecipientId

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Plusieurs remarques :

    - utilise les balises code. C'est plus lisible et ça permet d'indenter

    - la deuxième requête n'est pas tout à fait la même. Il manque une restriction (donc elle modifie plus d'enregistrements) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE N2.iCUS_PRINCIPAL = 0
    - la deuxième requête me paraît mieux écrite, et devrait être plus performante (la requête 1 fait plusieurs sous-requêtes pour chaque enregistrement de N2)

    - dans la deuxième requête, pourquoi tu fais les sous-requêtes R1 et R2 ? Elles sont quasiment identiques et tu peux récupérer les deux infos en une seule sous-requête :

    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
    UPDATE N2
    SET
          N2.tsCreated = COALESCE(R1.dateInserted, N2.tsCreated)
        , N2.tsLastModified = 
            CASE WHEN (N2.tsLastModified > R1.dateModified)
            THEN
                N2.tsLastModified
            ELSE
                COALESCE(R1.dateModified, N2.tsLastModified) 
            END 
    FROM neolane.NmsRecipient N2
    LEFT JOIN 
    (
        SELECT iRecipientIdProd, MIN(dateInserted) dateInserted, MAX(dateModified) dateModified
        FROM dbo.SrcRecipient 
        GROUP BY iRecipientIdProd
    ) R1
        ON R1.iRecipientIdProd = N2.iRecipientId
    WHERE N2.iCUS_PRINCIPAL = 0
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  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
    Par défaut
    Bonjour,

    en plus des remarques de pcaboche, je rajouterai que dans votre première requête, il serait préférable d'utiliser ISNULL à la place de COALESCE, car sinon, chaque sous requete qui ne renvoi pas NULL sera exécutée deux fois...

    Cela ne s'applique pas à votre deuxième requete, puisqu'il ne s'agit pas de sous requete dans le COALESCE.

    Dans tous les cas en effet, préférez la troisième requete, celle de pcaboche...

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut Si je peux me permettre d'ajouter mon grain de sel...
    A moins que ce j'ai lu récemment à ce sujet soit faux, UPDATE...FROM... n'est pas du sql normatif.

    Du point de vue de la norme SQL, un ordre de type UPDATE a une clause SET et une clause WHERE. Et c'est tout. S'il faut aller chercher des infos "ailleurs", il faudrait le faire via des sous-requêtes.

    On n'a pas la version de SQL Server utilisée ici mais on peut raisonnablement supposé de nos jours qu'il s'agit d'une version 2008R2 ou +. Du coup, toujours histoire de coller avec la norme, on peut utiliser l'instruction MERGE si on veut vraiment faire une jointure.

    N.B. : Si je retrouve l'article en question, je posterai la source.

    EDIT : Et voilà l'article.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Il pue du cul, l'UPDATE en sql normatif. Il est aussi bien pensé qu'une voiture sans roues.

    En SQL Server, MERGE n'est apparu qu'avec la version 2008. Pas besoin de se couper les cheveux en 4 Microsoft qui fait rarement bien les choses a pourtant bien fait de rajouter une clause FROM à UPDATE (et à DELETE dans une moindre mesure).

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par pcaboche Voir le message
    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
    UPDATE N2
    SET
          N2.tsCreated = COALESCE(R1.dateInserted, N2.tsCreated)
        , N2.tsLastModified = 
            CASE WHEN (N2.tsLastModified > R1.dateModified)
            THEN
                N2.tsLastModified
            ELSE
                COALESCE(R1.dateModified, N2.tsLastModified) 
            END 
    FROM neolane.NmsRecipient N2
    INNER JOIN 
    (
        SELECT iRecipientIdProd, MIN(dateInserted) dateInserted, MAX(dateModified) dateModified
        FROM dbo.SrcRecipient 
        GROUP BY iRecipientIdProd
    ) R1
        ON R1.iRecipientIdProd = N2.iRecipientId
    WHERE N2.iCUS_PRINCIPAL = 0
    Juste, que ce devrait être un LEFT JOIN, sinon c'est exactement ce qu'il faut.

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Juste, que ce devrait être un LEFT JOIN, sinon c'est exactement ce qu'il faut.
    Tu as raison. Je corrige.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

Discussions similaires

  1. Votre avis sur deux system VOD
    Par Dine94000 dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 04/09/2014, 16h31
  2. Votre avis sur deux ouvrages Linux embarqué
    Par deletme dans le forum Livres
    Réponses: 0
    Dernier message: 28/10/2013, 13h05
  3. Votre avis sur ma requête SQL
    Par deli2025 dans le forum Requêtes
    Réponses: 21
    Dernier message: 01/03/2013, 09h47
  4. Avis sur deux requêtes
    Par davland7 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/12/2011, 08h25
  5. Réponses: 8
    Dernier message: 25/06/2009, 18h18

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