273 votes

Jointure interne ou Where

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

?

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 le where clause.

0 votes

Dans l'ancienne version d'oracle la base de données n'existe pas join

208voto

Kiewic Points 2863

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

4 votes

Je souhaite vraiment voir s'il existe une documentation officielle d'Oracle à ce sujet.

73voto

Craig Trader Points 8924

Si l'optimiseur de requêtes fait bien son travail, il ne devrait pas y avoir de différence entre ces requêtes. Il s'agit simplement de deux façons de spécifier le même résultat souhaité.

23 votes

Oui, les performances devraient être les mêmes. Mais la syntaxe SELECT * FROM Table1, Table2 WHERE ... est diabolique !

2 votes

Je trouve qu'il est beaucoup plus facile de comprendre les FOR INNER JOINS que la syntaxe SQL-92. Votre avis peut varier.

31 votes

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.

69voto

Nescio Points 12613

Ils devraient être exactement les mêmes. Cependant, en tant que pratique de codage, je préfère voir le Join. Il exprime clairement votre intention,

10 votes

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.

15 votes

En effet. Les jointures représentent une relation sémantique entre deux ensembles de données, mais un where suggère un ensemble filtré. +1

31voto

user21241 Points 171

Utilisation de JOIN rend le code plus facile à lire, puisqu'il est auto-explicatif.

Il n'y a pas de différence de vitesse( Je viens de le tester ) et le plan d'exécution est le même.

1 votes

Merci. Je cherchais une compression de vitesse entre ces deux méthodes.

15voto

HLGEM Points 54641

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.

1 votes

Amen mon frère. A bas les JOINERS !

Prograide.com

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.

Powered by:

X