sql >> Databasteknik >  >> RDS >> Oracle

Oracle 10g Anslut efter tidigare - Prestandaproblem

Jag försökte återskapa din situation och jag kunde inte få Oracle att använda indexen på ett klokt sätt. Jag är säker på att det finns något smart sätt att göra det på. Men om ingen annan här kan lista ut det, nedan är det dumma, fula sättet.

Eftersom du bara får ett visst antal nivåer kan du skapa en anslutning manuellt. Hämta den första nivån, union den till den andra nivån (som får resultat från en kopia av den första frågan), union den till den tredje nivån (som får resultat från en kopia av den andra frågan), etc. Jag gjorde bara tre nivåer här, men du kan kopiera och klistra in för att göra den fjärde. Det är svårare att använda eftersom det ursprungliga ID:t upprepas så många gånger, men det är supersnabbt (0,005 sekunder på min maskin med 1,6 miljoner 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')
);


  1. MySQL Full-text Search Lösning för innoDB-tabeller

  2. POSTMAN returnerar datumfält med ändrade värden

  3. Ingen anslutning kunde göras eftersom målmaskinen aktivt vägrade det (PHP / WAMP)

  4. vad är skillnaden mellan '!=' och '<>' i mysql