Existe-t-il une différence de performance (dans oracle) entre
Select * from Table1 T1
Inner Join Table2 T2 On T1.ID = T2.ID
Et
Select * from Table1 T1, Table2 T2
Where T1.ID = T2.ID
?
Existe-t-il une différence de performance (dans oracle) entre
Select * from Table1 T1
Inner Join Table2 T2 On T1.ID = T2.ID
Et
Select * from Table1 T1, Table2 T2
Where T1.ID = T2.ID
?
Non ! Le même plan d'exécution, regardez ces deux tables :
CREATE TABLE table1 (
id INT,
name VARCHAR(20)
);
CREATE TABLE table2 (
id INT,
name VARCHAR(20)
);
Le plan d'exécution de la requête utilisant la jointure interne :
-- with inner join
EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
Et le plan d'exécution de la requête utilisant une clause WHERE.
-- with where clause
EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
Oui, les performances devraient être les mêmes. Mais la syntaxe SELECT * FROM Table1, Table2 WHERE ... est diabolique !
Je trouve qu'il est beaucoup plus facile de comprendre les FOR INNER JOINS que la syntaxe SQL-92. Votre avis peut varier.
Je trouve la syntaxe WHERE plus facile à lire que INNER JION - je suppose que c'est comme la Vegemite. La plupart des gens dans le monde trouvent probablement que c'est dégoûtant, mais les enfants qui en mangent adorent.
Je suis d'accord. En particulier si vous effectuez une jointure avec plusieurs tables, il est beaucoup plus facile d'analyser une instruction de sélection si vous effectuez des jointures explicites.
Je ne connais pas Oracle, mais je sais que l'ancienne syntaxe est dépréciée dans SQL Server et qu'elle finira par disparaître. Avant d'utiliser cette ancienne syntaxe dans une nouvelle requête, je vérifierais ce qu'Oracle prévoit d'en faire.
Je préfère la nouvelle syntaxe plutôt que le mélange des critères de jointure avec d'autres conditions nécessaires. Dans la nouvelle syntaxe, il est beaucoup plus clair de savoir ce qui crée la jointure et quelles autres conditions sont appliquées. Ce n'est pas vraiment un gros problème dans une requête courte comme celle-ci, mais cela devient beaucoup plus confus lorsque vous avez une requête plus complexe. Comme les gens apprennent sur les requêtes de base, j'aurais tendance à préférer qu'ils apprennent à utiliser la syntaxe de jointure avant d'en avoir besoin dans une requête complexe.
Encore une fois, je ne connais pas spécifiquement Oracle, mais je sais que la version SQL Server de l'ancienne jointure gauche est défectueuse, même dans SQL Server 2000, et donne des résultats incohérents (parfois une jointure gauche, parfois une jointure croisée), et ne devrait donc jamais être utilisée. Espérons qu'Oracle ne souffre pas du même problème, mais il est certain que les jointures gauche et droite peuvent être beaucoup plus difficiles à exprimer correctement dans l'ancienne syntaxe.
De plus, d'après mon expérience (et bien sûr, il s'agit d'une opinion strictement personnelle, vous pouvez avoir une expérience différente), les développeurs qui utilisent les jointures standard ANSII ont tendance à mieux comprendre ce qu'est une jointure et ce qu'elle signifie en termes d'extraction de données de la base de données. Je pense que c'est parce que la plupart des personnes ayant une bonne compréhension des bases de données ont tendance à écrire des requêtes plus complexes et celles-ci me semblent beaucoup plus faciles à maintenir en utilisant la norme ANSII que l'ancien style.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Pour mémoire, j'ai vu des requêtes renvoyer des résultats différents uniquement en passant d'une jointure à une clause where.
12 votes
@BlackTigerX : Des résultats différents ? Y avait-il des jointures externes impliquées ? Parce que je ne vois pas comment des résultats différents pourraient se produire entre une jointure externe et une jointure externe.
inner join ... on
par rapport à la mise en place de critères de jointure équivalents dans lewhere
clause.0 votes
Dans l'ancienne version d'oracle la base de données n'existe pas
join
2 votes
@MajidTaheri : De quelle ancienne version d'Oracle parlez-vous ? Toute version supportée par Oracle supporte la notation JOIN.
0 votes
Recherchez des réponses générales ou des meilleures pratiques basées sur des cas triviaux. J'aimerais voir un "rematch" avec des clauses where plus complexes impliquant plusieurs conditions AND. Au moins avec SQL Server, il y a un point de passage.
0 votes
Une chose à noter ici est que, si vous utilisez
inner join
et manquer leon
clause, elle soulève une erreur. Toutefois, si vous omettez la clausewhere
clause dans,
séparé, il renvoie plutôt une jointure croisée !