sql >> Base de Datos >  >> RDS >> Oracle

Oracle 10g Connect By Anterior:problemas de rendimiento

Traté de recrear su situación y no pude lograr que Oracle usara los índices de manera inteligente. Estoy seguro de que hay alguna forma inteligente de hacerlo. Pero si nadie más aquí puede resolverlo, a continuación se muestra la forma tonta y fea.

Dado que solo obtiene una cierta cantidad de niveles, puede crear manualmente una conexión. Obtén el primer nivel, únelo al segundo nivel (que obtiene resultados de una copia de la primera consulta), únelo al tercer nivel (que obtiene resultados de una copia de la segunda consulta), etc. Solo hice tres niveles aquí, pero puedes copiar y pegar para hacer el cuarto. Es más difícil de usar ya que la identificación original se repite muchas veces, pero es súper rápido (0,005 segundos en mi máquina con 1,6 millones de registros).

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