SQL Abfrage(n) optimieren
-
Hallo zusammen,
ich habe ein db Schema, das Tabellen über 3 Hierachiestufen miteinander verknüpft. Ein Objekt des Level 0 enhält n Objekte der Stufe 1, welche wiederum m Objekte der Stufe 2 enthält.
L0a +-- L1a | +-- L2a | | +-- L3a | | +-- L3b | | +-- L3c | +-- L2b | +-- L3d | +-- L3e +-- L1b +-- L2c +-- L3f +-- L3g +-- L3h +-- L3i +-- L3j
Im Moment benutze ich einen ziemlich naiven Ansatz, der mir zunächst alle Treffer der Stufe 0 zurückgibt.
Für jeden Treffer wird dann eine Abfrage ausgeführt, die mir alle zugehörigen Treffer der Stufe 1 zurückgibt.
Für jeden Treffer der Stufe 2 wird wiederum eine Abfrage ausgeführt, die mir alle zugehörigen Treffer der Stufe 3 zurückgibt.
Im Pseudocode sieht das so aus:L0Result = query_L0_objects(); for each( currentL0 in L0Result ) { // alle L1 Daten für Current0 aus Tabelle L1 holen L1Data = query_L1_objects( currentL0 ); for each( currentL1 in L1Data ) { // alle L2 Daten für CurrentL1 aus Tabelle L2A holen L2AData = query_L2A_objects( currentL1 ); // alle L2 Daten für CurrentL1 aus Tabelle L2B holen L2BData = query_L2B_objects( currentL1 ); // alle L2 Daten für CurrentL1 aus Tabelle L2C holen L2CData = query_L2C_objects( currentL1 ); // alle L2 Daten für CurrentL1 aus Tabelle L2D holen L2DData = query_L2D_objects( currentL1 ); for each( CurrentL2 in L2AData ) { // alle L3 Daten für CurrentL2 aus Tabelle L3 holen L3Data = query_L3_objects( CurrentL2 ); CurrentL2.L3Data = L3Data; } CurrentL1.L2AData = L2AData; CurrentL1.L2BData = L2BData; CurrentL1.L2CData = L2CData; CurrentL1.L2DData = L2DData; } currentL0.L1Data = L1Data; }
Das ist natürlich erschreckend langsam, weil viele SQL Abfragen mit wenigen Treffern ausgeführt werden, statt wenige Abfragen mit vielen Treffern, wo der Query-Optimizer Performance herauskitzeln könnte.
Wie könnte man die Abfrage optimieren? Vielleicht über einen View, Subselect oder sowas?
Wir benutzen postgresSQL 9.1.x als DBMS.