sql >> Database >  >> RDS >> Oracle

Oracle 10g Connect By Prior - prestatieproblemen

Ik heb geprobeerd uw situatie opnieuw te creëren en ik kon Oracle niet zover krijgen om de indexen verstandig te gebruiken. Ik weet zeker dat er een slimme manier is om het te doen. Maar als niemand anders hier erachter kan komen, is hieronder de domme, lelijke manier.

Aangezien u slechts een bepaald aantal niveaus krijgt, kunt u handmatig een verbinding maken door. Haal het eerste niveau, koppel dat naar het tweede niveau (dat resultaten krijgt van een kopie van de eerste zoekopdracht), koppel dat naar het derde niveau (dat resultaten krijgt van een kopie van de tweede zoekopdracht), enz. Ik heb maar drie niveaus gedaan hier, maar je kunt kopiëren en plakken om de vierde te maken. Het is moeilijker te gebruiken omdat het originele ID zo vaak wordt herhaald, maar het is supersnel (0,005 seconden op mijn machine met 1,6 miljoen records.)

--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. PostgreSQL:Hoe stel ik het zoekpad in op gebruikersniveau?

  2. Gebruik PostgreSQL SSL-verbinding in roest met zelfondertekende certificaten

  3. CDB-vloot beheren in Oracle Database 18c

  4. Oracle-query sequentiële sommatie per rijen