OERE et JOIN ordre d'opération
Ma question est similaire à ce SQL ordre des opérations mais avec un petit twist, donc je pense qu'il est juste de demander.
Je suis l'aide de Teradata. Et j'ai 2 tables: table1
table2
.
table1
n'a qu'une id
colonne.
table2
comporte les colonnes suivantes: id
val
J'ai peut-être tort, mais je pense que ces deux déclarations donnent les mêmes résultats.
Déclaration 1.
SELECT table1.id, table2.val
FROM table1
INNER JOIN table2
ON table1.id = table2.id
WHERE table2.val<100
Déclaration 2.
SELECT table1.id, table3.val
FROM table1
INNER JOIN (
SELECT *
FROM table2
WHERE val<100
) table3
ON table1.id=table3.id
À mes questions, l'optimiseur de requête doit être assez intelligent pour
- exécuter la clause where d'abord, puis, plus tard, REJOINDRE dans l'état 1
- vous savez que le tableau 3 n'est pas nécessaire dans l'état 2
Je suis assez nouveau à SQL, donc veuillez m'instruire si je ne suis malentendu quoi que ce soit.
source d'informationauteur Russell
Vous devez vous connecter pour publier un commentaire.
cela dépendra de beaucoup de beaucoup de choses (de la taille de la table, index, clés de distribution, etc), vous devriez vérifier le plan d'exécution:
vous ne dites pas la base de données, mais voici quelques façons:
MySql EXPLIQUER
SQL Server SHOWPLAN_ALL (Transact-SQL)
Oracle EXPLIQUER le PLAN
ce qui est expliquer dans teradata?
Teradata de Capturer et de comparer les plans plus vite avec Visual Expliquer et XML plan de journalisation
En fonction de la disponibilité des statistiques et de l'index pour les tables en question la requête de réécriture mécanisme de l'optimiseur peut ou peut ne pas opter pour analyser
Table2
pour les enregistrements oùval < 100
avant la numérisationTable1
.Dans certaines situations, basée sur les données démographiques, les jointures, d'indexation et de statistiques, vous pouvez constater que l'optimiseur n'est pas en éliminant les enregistrements dans le plan de requête lorsque vous vous sentez qu'il le devrait. Même si vous avez une table dérivée comme dans votre exemple. Vous pouvez forcer l'optimiseur de processus d'une table dérivée en plaçant simplement un GROUPE dans votre table dérivée. L'optimiseur est alors obligé de résoudre le GROUPE PAR agrégation avant de pouvoir envisager la résolution de la jointure entre les deux tables dans votre exemple.
Ce n'est pas à dire que votre approche standard doit être pour courir avec cette grâce à votre code. C'est typiquement une de mes dernières stations quand j'ai un plan de requête qui n'a tout simplement pas éliminer le superflu et de dossiers plus tôt dans le plan et les résultats dans trop de données en cours de numérisation et transporté à travers les différents fichiers SPOOL. C'est tout simplement une technique que vous pouvez mettre dans votre boîte à outils pour lorsque vous rencontrez une telle situation.
La requête de réécriture mécanisme est continuellement mis à jour d'une version à l'autre et les détails sur comment ça marche peut être trouvé dans la SQL de Traitement des Transactions Manuel pour Teradata 13.0.
À moins que je me manque quelque chose, Pourquoi avez-vous encore besoin de Table1??
Simplement des requêtes Table2
ou êtes-vous à l'aide de lignes dans le tableau 1 comme un filtre? c'est à dire, Ne table1 seulement copntain un sous-ensemble de l'Ids dans Table2??
Si oui, alors cela fonctionnera aussi bien ...
Mais pour répondre à votre question, Oui, l'optimiseur de requête doit être assez intelligent pour trouver le meilleur ordre dans lequel exécuter les mesures nécessaires pour traduire vos instructions logiques dans un résultat physique. Il utilise le strored statistiques de la base de données à jour sur chaque tableau pour déterminer quoi faire (ce type de jointure de la logique d'utilisation par exemple), comme wekll que ce, afin d'exécuter les opérations afin de minimiser Disque IOs et les coûts de traitement.
T1. exécuter la clause where d'abord, puis, plus tard, REJOINDRE dans l'état 1
La chose est, si vous changer l'ordre de jointure interne, c'est à dire INNER JOIN table2 table1, alors je suppose clause where peut être traitée avant de se JOINDRE à l'opération, au cours de la phase de préparation. Cependant, je pense que même si vous ne modifiez pas l'original de la requête, l'optimiseur doit être en mesure de changer leur ordre, s'il pense que l'opération de jointure sera trop cher avec de l'extraction de l'ensemble de la ligne, de sorte qu'il s'applique LORSQUE la première. Juste je pense.
T2. savoir que le tableau 3 n'est pas nécessaire dans l'état 2
Teradata va interpréter votre deuxième requête de telle façon que la table dérivée est nécessaire, afin de s'traitement tableau 3 impliquées opération.