Il existe un réel danger dans les requêtes offertes par Jim et Alex.
Supposons que vous ayez 20 ans de données, une requête sur YEAR = renvoie 5% des blocs. Je dis blocs et non lignes parce que je suppose que les données sont ajoutées à cette date afin que le facteur de regroupement est élevé.
Si vous voulez 1 an, vous voulez que l'optimiseur utilise un index sur l'année pour trouver ces 5% de lignes.
Si vous voulez toutes les années, vous voulez que l'optimiseur utilise une analyse de table complète pour obtenir chaque ligne.
Sommes-nous bons jusqu'à maintenant?
Une fois que vous mettez cela en production, la première fois qu'Oracle charge la requête, il pointe sur la variable de liaison et formule un plan basé sur cela. Donc, disons que le premier chargement est 'Tout'.
Très bien, le plan est une analyse de table complète (FTS) et ce plan est mis en cache et vous obtenez toutes les lignes en 5 minutes. Pas de gros problème.
La prochaine exécution, vous dites 1999. Mais le plan est mis en cache et utilise donc un FTS pour obtenir seulement 5% des lignes et cela prend 5 minutes. "Hmmm ... l'utilisateur dit, c'était beaucoup moins de lignes et le même temps." Mais c'est bien ... c'est juste un rapport de 5 minutes ... la vie est un peu lente quand ce n'est pas obligatoire mais personne ne crie. Cette nuit-là, les tâches par lots soufflent cette requête hors du cache et le matin, le premier utilisateur demande 2001. Oracle vérifie le cache, pas là, jette un œil à la variable, 2001. Ah, le meilleur plan pour cela est un balayage d'index. et ce plan est mis en cache. Les résultats reviennent en 10 secondes et envolent l'utilisateur. La personne suivante, qui est normalement la première, fait le rapport "ALL" du matin et la requête ne revient jamais.
POURQUOI?
Parce qu'il obtient chaque ligne en regardant à travers l'index .... horribles boucles imbriquées. Le rapport de 5 minutes est maintenant à 30 et compte.
Votre message original a la meilleure réponse. Deux requêtes, de cette façon les deux auront TOUJOURS le meilleur plan, lier la variable peeking ne vous tue pas.
Le problème que vous rencontrez est juste un problème fondamental d'Oracle. Vous exécutez une requête à partir d'un outil et récupérez les résultats dans l'outil. Si vous mettez une instruction select dans un bloc pl/sql, vous devez faire quelque chose avec. Vous devez le charger dans un curseur, un tableau ou une variable. Cela n'a rien à voir avec le fait que vous ayez tort et qu'ils ont raison ... c'est juste un manque de compétences pl/sql.
Vous devez faire quelque chose avec le résultat de la requête. que veux-tu faire après? –
Je veux juste qu'il renvoie les résultats. Je lie aux résultats avec un SqlDataSource dans ASP.NET. Je n'ai pas l'intention de créer ceci comme une procédure, je veux juste exécuter le bloc et lier aux résultats. Est-ce possible? – clifgriffin
@InSane ... complètement faux. –