Saya mencoba menciptakan kembali situasi Anda dan saya tidak dapat membuat Oracle menggunakan indeks dengan bijak. Saya yakin ada cara cerdas untuk melakukannya. Tetapi jika tidak ada orang lain di sini yang bisa mengetahuinya, di bawah ini adalah cara yang bodoh dan jelek.
Karena Anda hanya mendapatkan sejumlah level tertentu, Anda dapat membuat koneksi secara manual. Dapatkan level pertama, gabungkan itu ke level kedua (yang mendapat hasil dari salinan kueri pertama), gabungkan itu ke level ketiga (yang mendapat hasil dari salinan kueri kedua), dll. Saya hanya melakukan tiga level di sini, tetapi Anda dapat menyalin dan menempel untuk membuat yang keempat. Lebih sulit untuk digunakan karena id asli diulang berkali-kali, tetapi sangat cepat (0,005 detik di komputer saya dengan 1,6 juta catatan.)
--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')
);