sql >> Database teknologi >  >> RDS >> Oracle

Oracle 10g Connect By Prior - Ydelsesproblemer

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

  1. Udarbejdet erklæring om Postgresql in Rails

  2. Inkluderer værdier IKKE FUNDET i MySQL-forespørgselsresultater

  3. Tjek om PHP er blevet kompileret --with-mysql

  4. Hvordan returnerer man rækker baseret på databasebrugeren og tabellens indhold?