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.


Anmelden zum Antworten