Des performances d'Oracle à l'aide de fonctions dans la clause where
Dans une procédure stockée (qui a une date de paramètre nommé "paramDate' ) j'ai une requête comme celle -
select id, name
from customer
where period_aded = to_char(paramDate,'mm/yyyy')
va Oracle convertir paramDate à la chaîne pour chaque ligne?
J'étais sûr que l'Oracle n'est pas, mais on m'a dit que Oracle.
En fait je pensais que si le paramètre de la fonction contrainte (pas eu un fierld ni une valeur calculée à l'intérieur de la requête), le résultat doit être toujours le même, et c'est pourquoi Oracle doit effectuer cette conversion qu'une seule fois.
Puis j'ai réalisé que j'ai parfois exécutés DML phrases dans plusieurs fonctions, et peut-être cela pourrait causer de la valeur qui en résulte pour le changement, même si elle ne change pas pour chaque ligne.
Cela signifie que je dois convertir ces valeurs avant de m'ajouter à la requête.
De toute façon, peut-être bien connues des fonctions (intégré) sont évaluées une fois, ou même mes fonctions de l'être également.
De toute façon, encore une fois...
Va oracle exécuter que to_char une fois ou va Oracle de le faire pour chaque ligne?
Merci pour vos réponses
OriginalL'auteur Nicolás | 2009-07-13
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que c'est généralement le cas, car cela empêche un indice qui est utilisé.
Au moins pour les fonctions intégrées, Oracle devrait être en mesure de comprendre qu'il pourrait l'évaluer qu'une seule fois. (Pour les fonctions définies par l'utilisateur, voir ci-dessous).
Voilà un cas où un index est utilisé (et la fonction n'est pas évaluée pour chaque ligne):
Pour les fonctions définies par l'utilisateur de vérifier cette l'article. Il mentionne deux façons de s'assurer
que votre fonction est appelée qu'une seule fois:
Depuis Oracle 10.2, vous pouvez définir la fonction DÉTERMINISTE.
Sur les anciennes versions, vous pouvez ré-expression à utiliser "sous-requête scalaire de la mise en cache":
SELECT COUNT(*)
DES EMPLOYÉS
OÙ le SALAIRE = (SELECT getValue(1) DE la DOUBLE);
Fin merci, vous avez résolu ma question.
À l'aide d'une fonction dans la colonne dans la clause where forcé oracle de ne pas utiliser l'indice, quelque chose comme
WHERE trunc(my_date_column) = trunc(sysdate)
oracle 11. ReferenceOriginalL'auteur Thilo
À la recherche à écrire-ups sur le DÉTERMINISTE mot-clé (voici un, voici un autre), il a été introduit pour permettre au développeur de dire Oracle que la fonction va retourner la même valeur pour la même entrée params. Donc, si vous voulez que vos fonctions à être appelé qu'une seule fois, et vous pouvez garantir qu'ils retourne toujours la même valeur pour la même entrée params vous pouvez utiliser le mot-clé DÉTERMINISTE.
En ce qui concerne les fonctions intégrées comme
to_char
, j'en remettre à ceux qui sont bien versé dans les entrailles de l'Oracle pour vous donner la direction.OriginalL'auteur akf
L'inquiétude à propos de to_char ne sonne pas une cloche avec moi. Cependant, dans votre pl/sql,
vous pourriez avoir
Kt
OriginalL'auteur Karl T.