Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle 10g Connect By Prior – Leistungsprobleme

Ich habe versucht, Ihre Situation nachzubilden, und ich konnte Oracle nicht dazu bringen, die Indizes mit Bedacht zu verwenden. Ich bin sicher, es gibt einen schlauen Weg, es zu tun. Aber wenn es sonst niemand hier herausfinden kann, ist unten der dumme, hässliche Weg.

Da Sie nur eine bestimmte Anzahl von Ebenen erhalten, können Sie manuell eine Verbindung herstellen, indem Sie eine Verbindung herstellen. Holen Sie sich die erste Ebene, vereinigen Sie diese mit der zweiten Ebene (die Ergebnisse aus einer Kopie der ersten Abfrage erhält), vereinigen Sie diese mit der dritten Ebene (die Ergebnisse aus einer Kopie der zweiten Abfrage erhält) usw. Ich habe nur drei Ebenen durchgeführt hier, aber Sie können kopieren und einfügen, um den vierten zu machen. Es ist schwieriger zu verwenden, da die ursprüngliche ID so oft wiederholt wird, aber es ist superschnell (0,005 Sekunden auf meinem Computer mit 1,6 Millionen Datensätzen.)

--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')
);