Jeg forsøgte at genskabe din situation, og jeg var ikke i stand til at få Oracle til at bruge indekserne klogt. Jeg er sikker på, at der er en smart måde at gøre det på. Men hvis ingen andre her kan finde ud af det, er nedenfor den dumme, grimme måde.
Da du kun får et vist antal niveauer, kan du manuelt oprette en forbindelse med. Få det første niveau, foren det til det andet niveau (som får resultater fra en kopi af den første forespørgsel), foren det til det tredje niveau (som får resultater fra en kopi af det andet forespørgsel) osv. Jeg lavede kun tre niveauer her, men du kan kopiere og indsætte for at lave den fjerde. Det er sværere at bruge, da det originale id gentages så mange gange, men det er super hurtigt (0,005 sekunder på min maskine med 1,6 millioner poster.)
--Original animal
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 0 "level" from animals where animal_id = '101'
union all
--Parents
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
where animal_id = (select sire_animal_id from animals where animal_id = '101')
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
where animal_id = (select dam_animal_id from animals where animal_id = '101')
union all
--Grand parents
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select sire_animal_id from animals
where animal_id = (select sire_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select dam_animal_id from animals
where animal_id = (select sire_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select sire_animal_id from animals
where animal_id = (select dam_animal_id from animals where animal_id = '101')
)
union all
select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
where animal_id =
(
select dam_animal_id from animals
where animal_id = (select dam_animal_id from animals where animal_id = '101')
);