sql >> Databáze >  >> RDS >> Oracle

Oracle 10g Connect By Prior – Problémy s výkonem

Pokusil jsem se znovu vytvořit vaši situaci a nebyl jsem schopen přimět Oracle, aby používal indexy moudře. Jsem si jistý, že existuje nějaký chytrý způsob, jak to udělat. Ale pokud na to nikdo jiný nemůže přijít, níže je ten hloupý, ošklivý způsob.

Protože získáváte pouze určitý počet úrovní, můžete připojení vytvořit ručně. Získejte první úroveň, sjednoťte to s druhou úrovní (která získá výsledky z kopie prvního dotazu), sjednoťte to se třetí úrovní (která získá výsledky z kopie druhého dotazu) atd. Udělal jsem pouze tři úrovně zde, ale můžete zkopírovat a vložit a vytvořit čtvrtý. Používá se hůře, protože původní ID se tolikrát opakuje, ale je to super rychlé (0,005 sekundy na mém počítači s 1,6 miliony záznamů.)

--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. Co je skalární UDF na serveru SQL?

  2. Oracle 10g Connect By Prior – Problémy s výkonem

  3. Vložení proměnné do SQL dotazu z Javy

  4. Aktualizujte, pokud název existuje, jinak vložte - na SQL Server