Oracle 1: n interogare eficientă

Am două tabele A și B, unde o înregistrare în A este mapată la mai multe înregistrări în B. Există o interogare care arată înregistrările tabelului A, împreună cu toate înregistrările mapate în tabelul B într-o singură linie, cum ar fi:

TABLE A
--------
ID  Name  Tag ......
1    X    213
2    Y    222

TABLE B
--------
ID    ACCESS_AREA
1     101
1     104
1     105
2     101
2     103

Interogarea este ca:

SELECT ID,
       Name,
       Tag ,.....,
       (SELECT WM_CONCAT(ACCESS_AREA)
          FROM B
          WHERE ID = A.ID ) Access_areas
  FROM A

Deși cele de mai sus funcționează, performanța interogării este foarte scăzută, deoarece numărul de înregistrări din ambele tabele este foarte mare. Orice filtrare sau sortare pe access_areas are ca rezultat performanțe reduse.

Ne-am gândit să folosim o vizualizare materializată pentru a calcula valorile înaintea mâinii, astfel încât să fie o simplă intrare, dar mv nu permite reîmprospătarea rapidă la comiterea unor astfel de interogări utilizând funcții agregate.

O altă opțiune a fost adăugarea unei coloane în tabelul A, care conținea valorile calculate de la B și utilizează un declanșator în tabelul B pentru a actualiza noua coloană dacă s-au efectuat modificări. Dar, de asemenea, acest lucru nu este fezabil, deoarece nu puteți interoga aceeași masă unde este declanșatorul.

Ca o ultimă soluție, am decis să implementăm a doua opțiune și să actualizăm coloana prin codul aplicației, ceea ce este foarte obositor.

Vreo idee?

0

2 răspunsuri

1. Replace WM_CONCAT with either LISTAGG or COLLECT.

Agregarea de siruri mari poate fi destul de scumpă din cauza schimbărilor frecvente de context dintre SQL și PL/SQL. WM_CONCAT și STRAGG , sunt foarte populare, dar ambele sunt foarte ineficiente. Dacă sunteți pe 11gR2, utilizați întotdeauna LISTAGG . Dacă nu sunteți încă pe 11gR2, utilizați metoda COLLECT . Această pagină explică diferitele metode și are unele comparații de performanță.

2. Vedere materială.

Știu că ați spus că ați încercat deja acest lucru și că nu am prea multă experiență în ceea ce privește opiniile materializate, dar cred că ar trebui să funcționeze în acest caz. O vizualizare materializată rundă nu va funcționa, ci o cheie ar trebui.

(Cu excepția cazului în care există alte motive specifice care îl împiedică, caz în care este posibil să avem nevoie de toate detaliile pentru a rezolva problema: interogare completă și DDL pentru tabele, vizualizare materializată și jurnal de vizualizare materializat.)

3. Explicați planul.

După cum a menționat și Sycbean, poate fi o problemă planificată. Dacă utilizați doar un număr mic de rânduri, sunt utilizați indicii? Dar, pe lângă planul de explicații, trebuie să ne cunoaștem așteptările pentru această interogare. Dacă interogarea durează o secundă, dar returnează 200KB de date, atunci rețeaua sau browser-ul dvs. ar putea fi adevăratul gheare.


Nu sunt sigur dacă # 2 sau # 3 va ajuta, dar ar trebui să implementați întotdeauna # 1. Consider că WM_CONCAT și STRAGG sunt bug-uri - nu există nici un motiv întemeiat să le folosiți atunci când există alternative mult mai bune.

0
adăugat

Nu ați arătat planul EXPLAIN pentru interogare și nici ce indexuri există pentru tabele. Dar, cu atât mai important, nu ne-ați spus ce faceți cu aceste date - de ce aveți nevoie să accesați cantități mari de date la un moment dat? De ce trebuie să denosmalise rezultatele?

Puteți crea o vizualizare care include atât vizualizarea materializată, cât și datele brute actualizate de la crearea instantaneului (și, eventual, eliminarea intrărilor actualizate care nu mai sunt valabile), dar fără o idee despre modul în care datele sunt utilizate/decât adăugat la faptul că nu este cu adevărat posibil să oferiți sfaturi cu privire la particularități.

0
adăugat
Îmi pare rău, tot ce am menționat a fost un exemplu care seamănă cu scenariul cu care mă confrunt. Avem de fapt două coloane computerizate similare. De asemenea, din păcate, nu am spus nici în spec.
adăugat autor Rnet, sursa
Există o interfață frontală care afișează toate înregistrările din primul tabel și tabelele asociate într-o singură pagină, astfel interogarea
adăugat autor Rnet, sursa
Prin "pagină" vrei să spui HTML? Apoi, nu vă faceți griji - problemele legate de performanță cu interogarea sunt nimic în comparație cu problemele de performanță create prin livrarea acestora prin HTTP și încercarea de a le face folosind HTML. Este timpul să începeți să vă lustruiți CV-ul
adăugat autor symcbean, sursa