私はあなたの状況を再現しようとしましたが、Oracleにインデックスを賢く使用させることができませんでした。私はそれを行うためのいくつかの賢い方法があると確信しています。しかし、ここにいる他の誰もそれを理解できない場合は、以下が愚かで醜い方法です。
特定の数のレベルしか取得していないため、手動で接続を作成できます。最初のレベルを取得し、それを2番目のレベル(最初のクエリのコピーから結果を取得する)に結合し、それを3番目のレベル(2番目のクエリのコピーから結果を取得する)に結合するなど。3つのレベルのみを実行しました。ここにありますが、コピーして貼り付けて4番目にすることができます。元のIDが何度も繰り返されるため、使用するのは難しいですが、超高速です(160万レコードの私のマシンでは0.005秒)。
--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')
);