Précédent   Forum du club des développeurs et IT Pro > Bases de données > Sybase > Adaptive Server Enterprise
Adaptive Server Enterprise Forum d'entraide concernant Sybase Adaptive Server Enterprise, le dataserver phare de Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/06/2011, 11h29   #1
Aurélien LEQUOY
Membre du Club
 
Aurélien LEQUOY
Inscription : février 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Aurélien LEQUOY

Informations forums :
Inscription : février 2011
Messages : 63
Points : 49
Points : 49
Par défaut Question d'optimisation (ou pas ?)

Voilà, je cherche des "preuves" ? Il paraitrait que la requête suivante de ce type :

Code :
1
2
3
SELECT * 
FROM   employee, department 
WHERE  employee.DepartmentID = department.DepartmentID;
serait davantage "performant" que celle ci :

Code :
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.
Aurélien LEQUOY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 14h05   #2
mpeppler
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Âge : 53

Informations forums :
Inscription : janvier 2006
Messages : 1 307
Points : 1 643
Points : 1 643
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 14h09   #3
mpeppler
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Âge : 53

Informations forums :
Inscription : janvier 2006
Messages : 1 307
Points : 1 643
Points : 1 643
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 15h13   #4
Aurélien LEQUOY
Membre du Club
 
Aurélien LEQUOY
Inscription : février 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Aurélien LEQUOY

Informations forums :
Inscription : février 2011
Messages : 63
Points : 49
Points : 49
Cela confirme bien ce que je pensais ! merci
Aurélien LEQUOY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2011, 10h16   #5
Arnaud F.
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 188
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 188
Points : 8 881
Points : 8 881
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
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h31   #6
mpeppler
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Âge : 53

Informations forums :
Inscription : janvier 2006
Messages : 1 307
Points : 1 643
Points : 1 643
Envoyer un message via AIM à mpeppler
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 :
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 :
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 :
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/08/2011, 17h36   #7
fadace
Rédacteur/Modérateur
 
Avatar de fadace
 
Homme Fabien Celaia
Administrateur de base de données
Inscription : octobre 2002
Messages : 3 831
Détails du profil
Informations personnelles :
Nom : Homme Fabien Celaia
Âge : 42
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 3 831
Points : 13 970
Points : 13 970
Envoyer un message via ICQ à fadace Envoyer un message via Skype™ à fadace
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 / Sybase / MS-SQL / MySQL / DB2 / Postgresql / Informix
Administrateur SAP
Mes articles

Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
fadace est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h30.


 
 
 
 
Partenaires

Hébergement Web