web-dev-qa-db-fra.com

Performances des requêtes INNER JOIN ON ET comparaison

Je voudrais savoir laquelle est la meilleure en termes de performances entre les 2 requêtes indiquées ci-dessous ou fonctionnent-elles de manière identique?

Premier: [sans clause WHERE, juste AND avec ON]

SELECT related_tabid AS tabid, label, t.name
  FROM relatedlists r
     INNER JOIN tab t 
       ON t.tabid = r.tabid
          AND t.name = 'Leads'
          AND r.is_active=1  and r.related_tabid <> 0
          AND t.is_active=1
  ORDER BY label

Deuxième: [en utilisant la clause WHERE, ET associé à où au lieu de ON]

SELECT related_tabid AS tabid, label, t.name
  FROM relatedlists r
     INNER JOIN tab t 
       ON t.tabid = r.tabid
       WHERE t.name = 'Leads'
             AND r.is_active=1  and r.related_tabid <> 0
             AND t.is_active=1
  ORDER BY label
16
Rashidul Islam

Les deux requêtes sont identiques car la jointure utilisée est INNER JOIN. INNER JOIN fondamentalement, il filtre uniquement les lignes qui ont au moins une correspondance sur l'autre table. Même les deux tables sont interchangeables, le résultat est toujours le même.

Mais si vous les rejoignez via LEFT JOIN, les deux requêtes sont différentes l'une de l'autre et donneront un résultat différent.

10
John Woo

Il me semble que la seule différence entre les deux requêtes est que l'une a le t.name = 'Leads' dans la clause WHERE et on l'a dans la clause JOIN. Correct?

Il n'y a pas de différence entre les deux. L'optimiseur SQL les traitera de manière identique. Faites un EXPLICATION sur chacun d'eux pour vérifier.

2
Andy Lester

En théorie, la première requête est bien juste de vouloir mettre la comparaison de texte dans le "où", puis rejoint la définition de la "logique" de l'union des tableaux et le "où" n'est utilisé que pour spécifier des valeurs qui varient lors de la comparaison Où t.name = 'Leads'; Cordialement

0
0rochimaru