Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle 10g Connect według wcześniejszych — problemy z wydajnością

Próbowałem odtworzyć twoją sytuację i nie byłem w stanie skłonić Oracle do mądrego wykorzystania indeksów. Jestem pewien, że jest na to jakiś sprytny sposób. Ale jeśli nikt inny tutaj nie może tego rozgryźć, poniżej jest głupi, brzydki sposób.

Ponieważ otrzymujesz tylko określoną liczbę poziomów, możesz ręcznie utworzyć połączenie. Uzyskaj pierwszy poziom, połączenie tego z drugim poziomem (który otrzymuje wyniki z kopii pierwszego zapytania), połączenie tego z trzecim poziomem (który otrzymuje wyniki z kopii drugiego zapytania) itd. Zrobiłem tylko trzy poziomy tutaj, ale możesz skopiować i wkleić, aby utworzyć czwartą. Jest to trudniejsze w użyciu, ponieważ oryginalny identyfikator jest powtarzany tyle razy, ale jest super szybki (0,005 sekundy na moim komputerze z 1,6 milionami rekordów).

--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. Połączenie z bazą danych Oracle w web.config asp.net

  2. Jak wybrać i zoptymalizować indeksy oracle?

  3. Struktura testów jednostkowych dla Oracle PL/SQL?

  4. Jak rozwiązać ORA-29913 za pomocą tabel zewnętrznych

  5. Jak zobaczyć ograniczenia tabeli, na przykład, jeśli jest to klucz podstawowy lub klucz unikalny?