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

Adaptive Server Enterprise Sybase Discussion :

Question d'optimisation (ou pas ?)


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Points : 172
    Points
    172
    Par défaut Question d'optimisation (ou pas ?)
    Voilà, je cherche des "preuves" ? Il paraitrait que la requête suivante de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM   employee, department 
    WHERE  employee.DepartmentID = department.DepartmentID;
    serait davantage "performant" que celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
      FROM employee INNER JOIN department
        ON employee.DepartmentID = department.DepartmentID;

    Pour moi c'est qu'une question d'écriture et strictement identique au niveau du plan d'exécution, mais certains collègues pensent le contraire (prêt en débattre avec les mains lol). Donc si qqn d'entre vous avez déjà eu un cas ou la première requête serait plus performante que la 2eme n'hésiter pas à nous donner un exemple.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Il n'y a strictement aucune difference de performance. Les deux formes sont équivalentes.
    Tu peux le vérifier en regardant le plan des deux forme (set showplan on)

    Pour moi, la forme ANSI (avec JOIN ... ON ...) est à préférer parce que plus expressive, et plus correcte lorsque l'on utilise des OUTER join.

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Beaucoups de collègues sont réticents à utiliser la forme ANSI par un manque d'habitude. J'ai aussi eu de la peine au début, mais après quelque temps je ne fais plus que cela, aussi parce qu'une jointure complexe (10+ tables) devient illisible dans l'ancien format, alors qu'en mode ANSI on peut bien suivre quelle table joint avec quelle autre.

    Michael (qui code en T-SQL depuis 1989...)
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  4. #4
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Points : 172
    Points
    172
    Par défaut
    Cela confirme bien ce que je pensais ! merci

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Citation Envoyé par mpeppler Voir le message
    Beaucoups de collègues sont réticents à utiliser la forme ANSI par un manque d'habitude. J'ai aussi eu de la peine au début, mais après quelque temps je ne fais plus que cela, aussi parce qu'une jointure complexe (10+ tables) devient illisible dans l'ancien format, alors qu'en mode ANSI on peut bien suivre quelle table joint avec quelle autre.

    Michael (qui code en T-SQL depuis 1989...)
    Personnellement, je suis dans le même cas de figure, des collègues réticents a cette norme et utilise toujours l'ancienne méthode de jointure.

    Je me mets petit à petit à la norme mais c'est vrai que c'est pas évident au premier abord

    Sinon +1 pour tout ce qu'a dit Michael, les requêtes sont strictement identiques.

    Arnaud (qui code en T-SQL depuis 2008 )
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Je conseil très fortement d'adopter la forme ANSI.

    P.ex. query pour extraire les colonnes/types pour une table, en mode "ancien":

    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
    SELECT DISTINCT
           Column_name  = c.name,
           Type         = t.name,
           Length       = c.length,
           Prec         = c.prec,
           Scale        = c.scale,
           Nulls        = convert(bit, (c.status & 8)),
           Default_name = object_name(c.cdefault),
           Rule_name    = object_name(c.domain),
           Ident        = convert(bit, (c.status & 0x80)),
           Default_Ddl  = isnull (d.status & 4096, 0),
           Rule_Ddl     = isnull (r.status & 4096, 0),
           DefaultId    = c.cdefault,
           RuleId       = c.domain,
           Column_len   = char_length(c.name),
           Type_len     = char_length(t.name)
      FROM dbo.syscolumns    c
          ,dbo.systypes      t
          ,dbo.sysprocedures d
          ,dbo.sysprocedures r
     WHERE c.id        = object_id('sysobjects')
       AND c.usertype *= t.usertype
       AND c.cdefault *= d.id
       AND c.domain   *= r.id
     ORDER BY c.colid
    Si je recode en mode ANSI:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select ...
    from
        syscolumns c
        left join systypes t
            on t.usertype = c.usertype
        left join sysprocedures d
            on d.id = c.cdefault
        left join sysprocedures r
            on r.id = c.domain
    where
        c.id = object_id('sysobjects')
    J'écris toujours la query dans l'ordre naturel (prends une ligne dans syscolumns, va trouver la ligne correspondantes dans systypes, dans sysprocedures, etc.) et je mets toujours la table référencée à gauche dans la clause ON. Cela permet de rapidement comprendre comment la query est construite.

    Les jointures ANSI permettent aussi de faire des jointures imbriquées, et en mode developpement/debugging c'est trivial de commenter un partie de la jointure pour comprendre des jointures qui ne ramènent pas ce qui est escompté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select *
    from
        syscolumns c
        left join systypes t
            on t.usertype = c.usertype
        left join sysprocedures d
            on d.id = c.cdefault
    --    left join sysprocedures r
    --        on r.id = c.domain
    where
        c.id = object_id('sysobjects')
    (bon, cet exemple n'est pas très parlant, mais si on considère une query avec 10 ou 15 tables (et j'en ai plein) le fait de pouvoir executer une partie de la query facilement permet un gain de temps appréciable...

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  7. #7
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 554
    Points
    19 554
    Billets dans le blog
    25
    Par défaut
    Je plusoie avec un bémol.

    En inner join, sous Sybase ASE, les formes sont identiques.

    Il n'est est rien en ce qui concerne, si je ne m'abuse, l'OUTER JOIN lorsque l'on conditionne sur la table externe. Je crois me souvenir que le comportement de l'ASE en version *= n'est pas similaire à la norme, mais que le comportement est correct via l'OUTER JOIN.

    Une raison de plus pour utiliser la jointure ANSI qui a le mérite de dissocier clairement conditions de jointures et conditions fonctionnelles.
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

Discussions similaires

  1. Questions d'optimisation de requêtes
    Par beberd dans le forum Requêtes
    Réponses: 30
    Dernier message: 18/01/2007, 15h51
  2. [Question Bete] f ou pas f!!!
    Par theshark85 dans le forum C
    Réponses: 17
    Dernier message: 20/05/2006, 16h02
  3. Question SQL (facile) mais pas pour moi
    Par fabianrs dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/03/2006, 03h44
  4. question conceptuelle optimisation.
    Par mandrake_of_mandregas dans le forum Access
    Réponses: 1
    Dernier message: 29/12/2005, 10h07
  5. :?: question d'optimisation!
    Par Stopher dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/06/2004, 17h15

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