Plusieurs Jointures dans Teradata SQL - plus Rapide d'Utiliser des sous-requêtes ou des Tables temporaires?
Je suis en train d'écrire de SQL pour Teradata. J'ai besoin d'utiliser des jointures pour la connexion à des données provenant de plusieurs tables. Il est généralement plus rapide à utiliser des sous-requêtes, ou de créer des tables temporaires et ajouter des colonnes de jointure à la fois? Je suis en train de le tester moi-même, mais le trafic réseau, il est difficile pour moi de dire qui est plus rapide.
Exemple:
SELECT a.ID, a.Date, b.Gender, c.Age
FROM mainTable AS a
LEFT JOIN (subquery 1) AS b ON b.ID = a.ID
LEFT JOIN (subquery 2) AS c ON c.ID = a.ID
Ou je pourrais...
Exemple B:
CREATE TABLE a AS (
SELECT mainTable.ID, mainTable.Date, sq.Gender
FROM mainTable
LEFT JOIN (subquery 1) AS sq ON sq.id = mainTable.ID
)
CREATE TABLE b AS (
SELECT a.ID, a.Date, a.Gender, sq.Age
FROM a
LEFT JOIN (subquery 2) AS sq ON sq.id = a.ID
)
En supposant que je nettoie tout suivi par la suite, est une approche préférable à l'autre? Encore une fois, je voudrais juste tester moi-même, mais le trafic réseau est gentil de me gâcher.
EDIT: La table principale a n'importe où à partir de 100k à 5 millions de lignes. Les sous-requêtes de retour une relation 1:1 à la table principale, l'IDs, mais nécessitent des clauses where pour filtrer les dates. La sous-requête SQL n'est pas trivial, je suppose que c'est ce que j'essaie de transmettre.
OriginalL'auteur Jeffrey Kramer | 2013-08-14
Vous devez vous connecter pour publier un commentaire.
Bien sûr, il est recommandé d'écrire les jointures, c'est pourquoi il y a un optmizer 🙂
Si vous créez des tables temporaires force d'une commande spécifique de traitement au lieu de laisser l'optimiseur de décider qui est le meilleur plan.
La création de tables temporaires pourrait être utile dans certains cas rares, lorsque vous avez vraiment une requête complexe avec des dizaines de jointures et vous avez besoin de le casser plus facilement maintenable parties, ou si vous désirez obtenir une PI pour la poursuite du traitement.
Concernant le test de différentes approches:
D'exécution ne doit jamais être utilisé pour cela, il peut varier fortement en fonction de la charge sur le serveur. Vous avez besoin d'accéder à Teradata du Journal de la Requête (DBQL: dbc.QryLogV, etc.) pour obtenir plus de détails à propos du PROCESSEUR réel/IO/spool d'utilisation. Si vous n'avez pas accès à elle, vous pourriez demander à votre DBA à l'accorde.
Btw, au lieu de vraies tables, vous devez créer VOLATILE des TABLES qui sont automatiquement supprimés lorsque vous fermeture de session.
VOLATILE
tables, cela rendrait la vie plus facile dans presque tous les cas.Avec Teradata 14 ou 14.10 vous devriez être en mesure d'utiliser plusieurs expressions de table communes ainsi, si ma mémoire est correcte.
OriginalL'auteur dnoeth