Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle 10g Connect By Prior - Проблеми с производителността

Опитах се да пресъздам вашата ситуация и не успях да накарам Oracle да използва индексите разумно. Сигурен съм, че има някакъв умен начин да го направим. Но ако никой друг тук не може да го разбере, по-долу е тъпият, грозен начин.

Тъй като получавате само определен брой нива, можете ръчно да създадете връзка. Вземете първото ниво, обединете това към второто ниво (което получава резултати от копие на първата заявка), обединете това към третото ниво (което получава резултати от копие на втората заявка) и т.н. Направих само три нива тук, но можете да копирате и поставите, за да направите четвъртия. По-трудно е да се използва, тъй като оригиналният идентификатор се повтаря толкова много пъти, но е супер бърз (0,005 секунди на моята машина с 1,6 милиона записа.)

--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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добър инструмент за разработка и управление на база данни на Oracle в Windows

  2. Защо не мога да използвам променлива за свързване в команда за незабавно изпълнение?

  3. Как мога да получа броя на дните между 2 дати в Oracle 11g?

  4. В клъстер на Oracle sysdate винаги ли ще връща последователен отговор?

  5. PHP предупреждение при стартиране, докато се опитвате да заредите php_oci8.dll