J'ai un (simplifié) requête comme ceci:force sous-requête SQL à exécuter d'abord
SELECT DISTINCT this_.person_id AS y0_
FROM coded_entity this_
WHERE this_.code = ?
AND this_.tenant_id = ?
AND this_.person_id IN (SELECT person_id
FROM person that
WHERE that.date_voided IS NULL
AND that.ssn = ?
AND that.tenant_id = ?)
Je voudrais être en mesure de forcer Oracle à exécuter toujours la sous-requête le plus interne d'abord parce que je sais que ce sera toujours plus sélectif. Le code a seulement quelques valeurs alors que le ssn a une multitude beaucoup plus grande. Chaque table aura le même nombre de lignes.
Cependant, dans la pratique, il arrive que l'OCB Oracle décide d'exécuter la requête coded_entity en premier, causant des temps beaucoup plus lents.
Existe-t-il un moyen de forcer ce comportement sans diviser la requête en appels distincts?
Avez-vous pensé à utiliser l'indice de cardinalité? –
Rassemblez les statistiques, Oracle n'est pas si stupide, il doit y avoir une raison pour laquelle le plan exec n'est pas stable. Sinon, en dernier recours, vous pouvez utiliser les indications CARNALITY, MATERIALIZE ou NO_PUSH_PRED – ibre5041
La colonne '' person_id' est-elle une clé primaire dans la table de personne? – krokodilko