-2
votes

Performance Oracle et rejoindre ou

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: xxx

résultats: 20k lignes et 0.2S xxx

résultats: 20k Rangées et 0,2s xxx

résultats: 20k lignes et heure sont 30s!

plate-forme: Oracle 11xe Linux.

Pourquoi une telle différence d'exécution de temps d'exécution?


4 commentaires

Votre requête n'est pas valide SQL pour commencer. Où définissez-vous B ?


"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.


3 Réponses :


3
votes

au lieu d'ou essayer d'utiliser Union xxx

ou union tout xxx


2 commentaires

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!



0
votes

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.


0 commentaires

1
votes

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 ou dans les jointures peuvent causer des problèmes de performances - ou empêchent l'optimiseur d'utiliser des jointures de hachage .

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 ou , Oracle devra utiliser une méthode de jointure plus lente, comme une fusion de tri ou une boucle imbriquée.

Si vous pensez au nombre de lignes des deux tables en tant que M et n , une jointure de hachage peut (théoriquement) être effectuée dans m + n OPÉRATIONS, ATTENDU QUE une solution de fusion de tri peut être effectuée dans M * journal (n) . 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.

A Union 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 sur Union ou Union tout car ces deux versions peuvent ne pas nécessairement renvoyer les mêmes lignes que vos autres requêtes. Par exemple, les alternatives Union 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.)

Cette connaissance est utile car ou n'est pas lent intrinsèquement et nous ne voulons pas toujours l'éviter. Si le ou 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.


0 commentaires