J'ai parfois un problème avec la connexion et la clause "ou". L'exemple est simplifié, mais cela montre la signification de la question: résultats: 20k lignes et 0.2S p> résultats: 20k Rangées et 0,2s p> résultats: 20k lignes et heure sont 30s! P> plate-forme: Oracle 11xe Linux. P> Pourquoi une telle différence d'exécution de temps d'exécution? p> p>
3 Réponses :
au lieu d'ou essayer d'utiliser Union ou union tout p>
Je ne peux pas utiliser UNI, car il s'agit d'une requête composée de 30 connexions entre les tables ...;) Seule cette jointure provoque un tel retard. Mais je vais essayer de casser cet appel (rejoindre gauche) en deux ..
HMM, SELECT A.ID, B.ID DU TABLE DE TABLEAU A GAUCHE JOIN TABLE2 B ON (B.ID = A.ID) Gauche Joindre Table2 C sur (C.ID2 = A.ID2) Travailler!
Il n'est pas vraiment possible de répondre à une question de performance comme celle-ci sans un plan d'exécution. Si je devais deviner, je soupçonnerais que vous avez un index sur A.ID et B.ID, mais pas sur A.ID2 et B.ID2. P>
La réponse de SCAEDGE fournit une solution spécifique, mais il convient également d'apprendre la raison générique pour laquelle les conditions Les jointures de hachage sont généralement le moyen le plus rapide de rejoindre un grand pourcentage de données. (Vos tables peuvent être petites mais car il n'y a pas de filtres, ils traitent un pourcentage élevé de données.) Mais les jointures de hachage ne peuvent travailler que avec des conditions d'égalité. Pour traiter une condition Si vous pensez au nombre de lignes des deux tables en tant que A Cette connaissance est utile car ou code> dans les jointures peuvent causer des problèmes de performances - ou code> empêchent l'optimiseur d'utiliser des jointures de hachage . p>
ou code>, Oracle devra utiliser une méthode de jointure plus lente, comme une fusion de tri ou une boucle imbriquée. P>
M code> et n code>, une jointure de hachage peut (théoriquement) être effectuée dans m + n CODE> OPÉRATIONS, ATTENDU QUE une solution de fusion de tri peut être effectuée dans M * journal (n) code>. Si vous êtes curieux, Cet exemple de chapitre contient plus de détails sur les différents types de jointures d'Oracle et comment leurs performances se compare. P>
Union code> La version doit rejoindre les tables deux fois, mais deux jointures rapides peuvent être meilleures qu'une jointure lente. Oracle ne peut pas toujours convertir un ou code> sur Union code> ou Union tout code> car ces deux versions peuvent ne pas nécessairement renvoyer les mêmes lignes que vos autres requêtes. Par exemple, les alternatives code> Union code> traiteraient des lignes en double différemment. (Mais peut-être que vous savez quelque chose à propos de vos données que Oracle ne le fait pas, afin que les requêtes puissent toujours fonctionner correctement pour vous.) P>
ou code> n'est pas lent intrinsèquement et nous ne voulons pas toujours l'éviter. Si le ou code> fait partie d'un accès index, ou une partie d'une jointure qui n'utilisera pas de hachage Joindre de toute façon, il n'y a rien de mal à cela. P>
Votre requête n'est pas valide SQL pour commencer. Où définissez-vous
B code>?"B" est un alias de table2
S'il vous plaît dans les questions de code donnez un Exemple de reproductible minimal - comprenant des données minimales et des données minimales de colle et de représentation minimale donnée comme code. Pour SQL qui inclut le DBMS & DDL, y compris les contraintes, les index et l'initialisation tabulaire. Pour les performances SQL qui inclut expliquer les résultats et les statistiques. S'il vous plaît rechercher et résumer. Pour SQL comprenant des bases d'optimisation / performance - conduisant immédiatement à des index, plans, statistiques et sargabilité. Conseils pour demander une bonne question SQL Demandez à Re Optimisation après avoir appris et appliqué ces bases. Comment demander
S'il vous plaît clarifier via des modifications, pas des commentaires.