2010-07-09 6 views
0

Lequel est le meilleur en SQL?Lequel est le meilleur en SQL?

SELECT A.COL_A1, B.COL_B1 FROM TABLE1 A, TABLE2 B 
WHERE A.COL_A1 = B.COL_B1 

ou:

SELECT B.COL_B1, A.COL_A1 FROM TABLE2 B, TABLE1 A 
WHERE B.COL_B1 = A.COL_A1 

plus d'info .. http://publib.boulder.ibm.com/infocenter/iisclzos/v9r1/index.jsp?topic=/com.ibm.websphere.ii.federation.classic.tuning.doc/tuning/iiyfctqcjoin.html

+0

Mieux de quelle manière? – Oded

+1

Quelle base de données? À quoi ressemblent les tableaux? Quel genre et combien de données y a-t-il dans les tableaux? Quel type de données sont ces champs ?? Impossible de répondre sans ** beaucoup ** plus d'informations de votre part! –

+0

Évidemment la performance. – Venom

Répondre

1

Je suppose que cela n'a pas du tout question, vous appelez les deux tables dans les deux sens.

8

Aucune.

SELECT 
    A.COL_A1, B.COL_B1 
FROM TABLE1 A 
    INNER JOIN TABLE2 B ON A.COL_A1 = B.COL_B1 

Si vous posez des questions sur les performances (ce qui n'est pas le cas), effectuez un test sur votre plate-forme particulière.

+1

Son code est l'équivalent de votre jointure interne, cela ne fera aucune différence –

+0

Je ne peux pas imaginer jongler avec l'ordre des colonnes et rejoindre sera soit. C'est mieux (dans mon esprit) en termes de lisibilité. – spender

+2

@Tobias P: tous les 3 sont équivalents mais ceci est * correct * depuis ANSI-92. SQL est bien entendu déclaratif, donc vous dites à l'optimiseur ce que vous voulez et laissez-le le trier. – gbn

1

Cela dépend du système de base de données dont nous parlons. Dans beaucoup de SGBDR, il y a une sorte d'optimisation des requêtes - donc comment vous construisez votre requête peut ne pas être la façon dont le serveur va le traiter ...

Par exemple, il y a l'Optimiseur de requête qui va exécuter une exécution plan; Habituellement, il obtient le droit, mais vous pouvez help it along the way.

La plupart des autres DB principaux ont quelque chose de similaire ... donc dans votre exemple, il y a de fortes chances que vos deux exemples soient traités exactement de la même manière.

3

Cela ne devrait faire aucune différence puisqu'il est probable que l'une de ces instructions soit convertie en interne par l'optimiseur. Comme pour toujours être sûr: exécuter des tests avec les deux, il peut y avoir de légères différences selon la base de données que vous utilisez

0

Comme dans le lien que vous avez décrit, cela dépend de la table dans laquelle un index unique est défini (peut-être IBM DBs). Votre réponse est la page d'aide vous :) lié

reagards

1

SQL est declarative si vous racontez l'optimiseur ce que vous voulez, pas comment pour le faire.

Ils sont égaux parce qu'il est basé sur la théorie mathématique, et non pas l'ordre d'exécution

Cependant, la réponse de Spender est correcte puisque c'est ANSI-92 en utilisant REJOIGNEZ plutôt que l'ancienne « filtrée cartésienne » vous avez publié. Pourquoi lisez-vous la documentation de WebSphere sur SQL Server? Vous devez vraiment travailler dur pour éviter de trouver un article SQL Server.

L'indexation (dans l'article) ne fait aucune différence avec les résultats dans SQL Server, uniquement pour les performances et le plan d'exécution utilisé. Pour SQL Server, l'indexation est considérée séparément de l'ordre JOIN/WHERE (ce qui n'a pas d'importance, c'est déclaratif bien sûr). Si WebSphere change lui plan basé sur JOIN pour ensuite franchement c'est plus de merde que je pensais (j'ai des clients utilisant mon DB de WebSphere ...)

0

Je suggère ...

SELECT COL_A1 
    FROM TABLE1 A 
    WHERE EXISTS (SELECT * 
         FROM TABLE2 B 
         WHERE A.COL_A1 = B.COL_B1); 

parce que Je préfère les sous-requêtes aux vues.

+0

Mais va-t-il mieux performer ...? (Voir les commentaires à la question) – onedaywhen

+0

Peut-être, mais pas probablement. L'optimiseur de requête va réécrire la sous-requête en tant que jointure si elle le juge approprié, et l'évaluer tel quel si ce n'est pas le cas. Cela vous évite de vous soucier du type de jointure à utiliser (voir le commentaire de Spender à la question initiale). –

+0

cela ne fonctionne que si vous ne voulez pas sortir de TABLE2 – gbn

Questions connexes