Announcement

Collapse
No announcement yet.

View ueber mehrere Tabellen --- dauert zu lange

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • View ueber mehrere Tabellen --- dauert zu lange

    Hi,

    Ich habe eine View über 5 Tabellen erzeugt. Wenn ich einen select auf
    den View ausfuehre, dann dauert es unheimlich lange (ca. 1 min) bis ich ein
    Ergebnis bekomme obwohl nur ca. 2000 Datensaetze im View sind.
    Ich benutze InterBase 5.6 und fuhre das Select - Statement ueber
    Interactive SQL aus.

    Ist mein View falsch angelegt oder dauert es tatsaechlich solange bei
    vielen Tabellen.
    Gibt es eine andere Moeglichkeit?

    Hier der View:
    <pre>
    create view ArchivUebersichtView(
    KATID, KATName,
    DTID, DTKatID, DTName, DTBeschreibung, DTKennung, DTAnleger,
    DTDatum,
    DIRID, DIRDTID, DIRName,
    DATEIID, DATEIDirID, DATEIName, DATEIExt, DATEIDatum,
    DIID, DIDateiID, DIInhalt)
    as
    select
    KAT.ID, KAT.NAME,
    DT.ID, DT.KATID, DT.NAME, DT.BESCHREIBUNG, DT.KENNUNG, DT.ANLEGER,
    DT.ANLAGEZEITPUNKT,
    DIR.ID, DIR.DTID, DIR.NAME,
    DATEI.ID, DATEI.DIRID, DATEI.NAME, DATEI.EXTENSION, DATEI.DATUM,
    DI.ID, DI.DATEIID, DI.INHALT
    from
    KATEGORIEN KAT inner join
    (DATENTRAEGER DT inner join
    (VERZEICHNISSE DIR left outer join
    (DATEIEN DATEI left outer join DATEIINHALTE DI
    on DATEI.ID = DI.DATEIID)
    on DIR.ID = DATEI.DIRID)
    on DT.ID = DIR.DTID)
    on KAT.ID = DT.KATID
    </pre>

  • #2
    Hallo, vielleicht etwas dumm, aber hast du einen Index auf alle Felder, die die Join-Bedingungen erfüllen?<br> Bei Joins können Indizes einen Geschwindigkeits-Zuwachs bis zum Faktor 1000 erzeugen, vor allem, wenn der Index-Baum flach bleiben kann (viele unterschiedliche werte und hohe page-size).<br&gt

    Comment


    • #3
      Hallo,

      Ja, jede Tabelle besitzt einen eindeutigen Index, mit diesen Indizies sind die Tabellen ueber den Join miteinander
      verbunden

      Comment


      • #4
        Hallo,

        die Ursache für die schlechte Performance liegt in den beiden OUTER JOINs. Man kann generell sagen, das jeder OUTER JOIN an dieser Stelle Probleme verursacht. Erschwerend kommt hinzu, das der InterBase-Optimizer nicht in jedem Fall den schnellsten Zugriffsweg automatisch findet, so das man selbst etwas experimentieren sollte (Umformulierung der SELECT-Abfrage; Ändern der Tabellenreihenfolge; Eingrenzen der Ausgangsdatenmenge über eine WHERE-Anweisung). Die Frage, ob ein Index vom InterBase-Optimizer bei Ermitteln des Zugriffspfades verwendet wird, kann man sich vom InterBase beantworten lassen: <br>
        1. InterBase-Tool InterBase Interactive SQL starten. <br>
        2. Über Session | Basic Settings wird die Checkbox Display Query Plan aktiviert. <br>
        3. Im Ausgabefenster zeigt das Tool dann den vom Optimizer gewählten Zugriffspfad an

        Comment


        • #5
          Hallo,

          zuerst mal Danke fuer Deine Anwort.
          Also, er nimmt die Indizies die ich angelegt habe.

          Stelle ich den View um so komme ich immer zum gleichen Ergebniss, es dauert einfach sehr lange.
          Ich habe festgestellt, das ein View mit nur einem outer join relativ schnell geht wo hingegen ab 2 oder mehr
          outer joins es dann sehr lange dauert, was Deine Anwort bestätigt.

          Noch eine Erkenntis:
          Ich habe einen View mit 2 outer joins. Frage ich den View mit einem select ab und verwende in der where Bedingung
          des selects ein Feld das einem Index gehört geht es wieder schnell

          Comment


          • #6
            Hallo,

            zum Glück lässt sich der InterBase-Optimizer manchmal überlisten ;-) <br>
            Und die Eingrenzen der Ausgangsdatenmenge über eine WHERE-Anweisung scheint als "Wundermittel" in diesem konkreten Fall auch indirekt über die SELECT-Abfrage des Views zu funktionieren

            Comment

            Working...
            X