Question

Pour le plaisir que je joue avec l'Optimiseur intégré pour Oracle Toad aujourd'hui. L'une des optimisations qu'il suggère est la suivante

AND emp.pay_type = NVL('FT', UID)

Au lieu de

AND emp.pay_type = 'FT'

Je suis confus sur ce qui se passe ici et à cause de cela, confus sur aussi pourquoi cela améliorerait les performances. Étant donné que FT est une chaîne de caractères dans la requête SQL et donc jamais NULL, pourquoi que cela ferait une différence? Je suppose qu'il a quelque chose à voir avec l'index existant sur le terrain, mais je suis incapable de trouver quoi que ce soit dans la documentation Oracle.

Était-ce utile?

La solution

C'est des conseils bizarre. La fonction NVL fonctionne comme ceci:

NVL(exp1, val1)

Si « exp1 » est pas nul, il est retourné; autrement 'val1' est renvoyée.

Depuis « FT » dans l'exemple ne peut pas être NULL, il n'y a aucun avantage à utiliser la fonction NVL, et une petite pénalité de performance (au moins pour l'optimiseur de travailler que NVL est redondant, peut-être une pénalité d'exécution si l'optimiseur ne fonctionne pas que NVL est redondant).

Si la condition de lire:

ET emp.pay_type = NVL ( "FT", UID)

alors il pourrait y avoir un avantage; nous avons ici un identificateur délimité (nom de colonne entre guillemets) et la valeur de la colonne pourrait peut-être NULL; l'appel NVL veille à ce que la valeur NULL est renvoyée que si "FT" est NULL et UID est NULL. UID est, bien sûr, un identifiant régulier.

Il peut donner un sens si la condition de lire:

AND emp.pay_type = NVL(UID, 'FT')

Maintenant, si la valeur UID est NULL, une valeur par défaut « FT » est utilisé comme pay_type correspondant.

Autres conseils

Je prendrais « suggestions d'optimisation » de crapaud avec d'énormes grains de sel. Je les appelle la méthode « fusil de chasse » d'optimisation - tirer beaucoup de différents bits sur la cible et de voir l'un d'eux frappe, en quelque sorte:)

Quoi qu'il en soit, la différence entre

AND emp.pay_type = NVL('FT', UID)

et

AND emp.pay_type = 'FT'

Est-ce dans le second cas, l'optimiseur peut utiliser les statistiques de l'histogramme sur la colonne (si elles ont été recueillies) pour obtenir une estimation plus précise du nombre de lignes correspondant. Lorsque le NVL est utilisé, cependant, l'optimiseur (je crois) ne détecte pas qu'il ne peut ignorer le NVL, et ne sera donc pas vérifier l'histogramme de la valeur.

Ce n'est pas une méthode d'optimisation je généralement utiliser. Il existe de meilleures façons de contrôler le chemin d'exécution d'une requête (notes, par exemple). cette méthode ne permettrait pas, en particulier, si elles ont amélioré le CBO à chercher et à optimiser le code redondant comme NVL([literal value],[anything]) à [literal value].

Qu'est-plan Explain Oracle vous dire au sujet des deux questions?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top