Performance: une sous-Requête ou de Rejoindre
J'ai une petite question concernant la performance d'un sous-requête /rejoindre une autre table
INSERT
INTO Original.Person
(
PID, Name, Surname, SID
)
(
SELECT ma.PID_new , TBL.Name , ma.Surname, TBL.SID
FROM Copy.Person TBL , original.MATabelle MA
WHERE TBL.PID = p_PID_old
AND TBL.PID = MA.PID_old
);
C'est mon SQL, maintenant cette chose qui tourne autour de 1 million de fois ou plus.
Ma question est de savoir ce qui serait le plus rapide?
- Si je change
TBL.SID
(Select new from helptable where old = tbl.sid
)
OU
- Si j'ajoute le "HelpTable" à la
from
et de faire le rejoindre dans lawhere
?
edit1
Eh bien, ce script ne fonctionne que comme beaucoup comme il r des personnes.
Mon programme dispose de 2 modules de celui qui remplit MaTabelle
et un que les transferts de données. Ce programme de fusion de 2 bases de données et coz de ce que, parfois, la même Clé est utilisée.
Maintenant, je suis en train de travailler sur une solution qui n'existe des doubles de Clés.
Ma solution est de faire un "HelpTable'. Le propriétaire de la clé(SID
) génère une nouvelle clé et l'écrit dans un "HelpTable'. Toutes les autres tables qui utilisent cette clé peut le lire à partir de la HelpTable'.
edit2
Quelque chose dans mon esprit:
si une table comme une Clé qui peut être null(foreignkey qui n'est pas lié)
alors ce ne sera pas le même à partir de ou?
OriginalL'auteur domiSchenk | 2010-05-20
Vous devez vous connecter pour publier un commentaire.
Moderne Sgbdr (Oracle, optimiser la plupart des jointures et sous-requêtes vers le même plan d'exécution.
Par conséquent, je voudrais aller de l'avant et écrivez votre requête de la manière la plus simple pour vous et vous assurer que vous avez optimisé votre index.
Si vous fournissez à votre dernière question et votre schéma de base de données, nous pourrions être en mesure d'offrir des suggestions détaillées, y compris des informations relatives à de possibles problèmes de verrouillage.
Modifier
Voici quelques conseils généraux qui s'appliquent à votre requête:
Nous n'avons pas besoin de toute votre schéma, juste les tables référencées dans la requête.
bien im en utilisant maintenant la sous-Requête est plus facile à faire merci pour votre aide.
OriginalL'auteur Marcus Adams
Rejoindre serait beaucoup plus rapide qu'une sous-requête
Parce qu'avec une sous-requête, d'une table temporaire sera créé en premier et ensuite il sera rejoint.
OriginalL'auteur ovais.tariq
La principale différence entre le sous-requête et de jointure est
sous-requête est plus rapide lorsque nous avons à récupérer des données à partir d'un grand nombre de tables.Parce que ça devient fastidieux à la jointure de plusieurs tables.
jointure est plus rapide pour récupérer des données à partir de la base de données lorsque nous avons moins de nombre de tables.
Aussi, ce rejoint vs sous-requête peut vous donner quelques infos
OriginalL'auteur Space
Au lieu de se concentrer sur la question de l'utilisation de jointure ou une sous-requête, je mettrait l'accent sur la nécessité de faire 1 000 000 d'exécutions de l'instruction insert. En particulier, comme Oracle optimizer-Marcus Adams l'a déjà souligné -, permettra d'optimiser et de réécrire vos déclarations en vertu de la couvre de façon optimale à la forme.
Vous êtes le remplissage de MaTabelle 1 000 000 de fois avec seulement quelques lignes et problème de cette déclaration? Si oui, alors la réponse est de le faire d'un seul coup. Pouvez-vous donner quelques informations sur votre processus de l'exécution de cette instruction?
EDIT: Vous indiquez que cette instruction insert est exécutée pour chaque personne. Dans ce cas, le conseil est de remplir MATabelle d'abord, et puis l'exécuter une fois:
Ce qui concerne,
Rob.
OriginalL'auteur Rob van Wijk