Bonjour,

sur une base oracle oracle 12C en environnement Linux

le métier a une requête dite de positionnement héritée d'un portage Iseries vers Unix pour laquelle le résultat du portage donne plusieurs sous requête "reliées" par un union all permettant de retourner l'ensemble des enregistrements d'une table à partir d'un enregistrement.

La requête utilse un hint FIRST et INDEX_ASC pour forcer l'utilisation de l'index répondant aux critères métiers.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Select /*+ FIRST_ROWS INDEX_ASC(table index) */ * from matable where a=:1, b=:2, c=:3, d >= :4 union all select *+ FIRST_ROWS INDEX_ASC(table index) */ * matable where a= :1, b= :2, c > :3 union all select *+ FIRST_ROWS INDEX_ASC(table index) */ * from matable where a = :1 and b > :2
La requête permet de retourner l'ensemble des enregistrements à partir d'un enregistrement donnée jusqu'à la fin de la table. Par rapport au besoin métier, la requête retourne plus d'enregistrement que nécessaire; elle est gérée par un curseur qui effectue un next si l'enregistrement courant correspond au besoin métier et sort de la boucle si l'enregistrement courant est en dehors du besoin.

Donc potentiellement, la requête initiale retourne plus d'enreg que nécessaire.

La question que je me pose est sur l'utilisation du HINT FIRST et de l'échange entre le process client et le process server pour savoir si malgré tout le moteur oracle retourne l'ensemble des enregistrements dans la PGA du process serveur et que ensuite l'échange entre le process client et le process server s'effectue au rythme des next de mon programme métier ou bien est que l'ensemble des enregistrements répondant à ma requête sont transmis dans la mémoire du process client ?

L'utilisation du hint FIRST permet-il ici de transmettre plus rapidement les données au process client dès qu'une des sous requêtes a été traitée par Oracle ?

Merci par avance pour vos retour