Announcement

Collapse
No announcement yet.

Arbeiten mit grossen Views

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

  • Arbeiten mit grossen Views

    <br><b>Hallo an alle!</b><br><br>
    Wir sind derzeit dabei eine Werkzeug-Verwaltung zu entwickeln, die auf eine Interbase-Datenbank aufsetzt. Die Software befindet sich bereits in der Testphase.<br>
    Die Daten sind in der Datenbank ziemlich stark normalisiert. Es existieren jedoch verschiedene Views, die der Anwendung die Daten zur Verfügung stellen.<br>Hauptsächlich wird auf 2 Views gearbeitet, die einmal 7 und einmal 11 Tabellen mittels <i>join</i> bzw. <i>left join</i> verbinden (es werden auch 1-2 Blobfelder und berechnete Felder in die Views eingebunden). Somit brauch die Anwendung nur ein <i>select...</i> auf diese Views zu machen und hat alle für den Anwender nötigen Daten.<br><br>
    Und nun meine Fragen:<br>
    1. Kann es zu <b>grossen</b> zeitlichen Einschränkungen beim Öffnen der grossen Views im Vergleich zu Tabellen bzw. kleineren Views kommen?<br>
    2. Wie verhält sich Interbase bei grossen Datenbanken mit höhem Normalisierungslevel?<br>
    3. Hilft es, die Views nach einer gewissen Arbeitszeit (<i>insert/delete/update</i> auf Tabellen) zu löschen (<i>drop</i>) und wieder zu erzeugen (<i>create</i>)?
    <br><br>
    Vielen Dank im voraus!<br><br>
    <b>MfG,<br>Carsten Haberland<br><br>

  • #2
    Hallo Carsten,
    <p>Wenn die Daten ohne Einschränkungen geöffnet werden kommt es früher oder später immer zu Zeitlichen Problemen, dafür gibt es ja WHERE.</p>
    <p>Im Client Server ist die Mengenorientierung entscheidend (kleine Menge = schnell; große Menge = langsam);</p>
    <p>Normalisierung hat vor und Nachteile das muss immer im jeweiligen Fall beurteilt werden.<br>
    Beispiel:</p>
    <li>Eine Tabelle verwaltet Artikel und Artikelgruppen das würde ich in jedem Fall Normalisieren</li>
    <li>Diese Tabelle hat ein Boolesches Feld (Y/N) Char(1) das würde ich nicht Normalisieren.</li>
    Gruß Andrea

    Comment


    • #3
      <br>Danke Andreas!<br><br>
      Ich glaube, da sind wir uns einig, dass eine Normalisierung Vor- und Nachteile hat.<br>Wir haben sie jedoch nicht soweit getrieben, dass wir beispielsweise bool. Felder normalisieren. Hier setzen wir Domains ein.<br><br>
      Nur leider sind unsere Ladezeiten bei grossen Datenmengen nicht akzeptabel. Gibt es vielleicht noch andere Tricks bei Interbase, die Geschwindigkeit zu erhöhen?<br><br>
      Beispielsweise haben wir die Buffergrösse auf 10000 hochgesetzt, aber irgendwie hat das alles noch langsamer gemacht!<br><br>
      MfG,<br>Carsten<br><br&gt

      Comment


      • #4
        Hallo Carsten,

        werden den von allen Tabellen mehrere Datensätze gleichzeitig genutzt ?
        Ansonsten ist eine Aufteilung sinnvoll, wenn eine Abfrage nur Einzelinformationen liefert werden die Daten per Stored Procedure abgeholt, die Tabellarischen Daten per Select.

        Ich habe einige Projekte, die pro Auftrag / Bestellung 10 - 15 Tabellen abfragen, durch die Aufteilung hat sich die Performance verdoppelt,

        Gruß Günte

        Comment


        • #5
          <br>Hallo Günter,<br><br>
          danke erstmal für deine Antwort!<br>
          Die Views sind so aufgebaut, dass sie Informationen zu allen Werkzeugen, die sich in der Datenbank befinden, aus unterschiedlichen Tabellen per <i>join</i> zusammenführen (wie Hersteller, Lagerort, Status, ...). Somit kann die Anwendung per <i>select</i> diverse Übersichten anbieten.<br><br>
          Mit Aufteilung meinst du sicherlich die Normalisierung der Daten in verschiedenen Tabellen?!<br><br>
          Wir haben jetzt über mehrere Testläufe herausgefunden, dass zugehörige Blobfelder zu einem Datensatz in separaten Tabellen ausgelagert werden und innerhalb der View nur eine ID auf diese verweisen sollte.<br>Je nachdem wie die Views aufgebaut sind, haben wir eine Performance-Verbesserung bis zu 50% erhalten!<br><br>
          MfG,<br>
          Carsten<br&gt

          Comment


          • #6
            Hallo Carsten,

            wenn Du alle Daten per join vor dem Select verknüpfst hast Du ja, wie dur beschrieben hast, sehr große Views.

            Ist das in der Anwendung nötig ? Beispiel :
            Ich habe eine Produktdatenbank mit 5 Tabellen, in denen jeweils nur eine Tabellenzeile auf das Produkt zutrifft sowie 4 Tabellen, in denen mehrere Zeile Info und Blobs zu dem Produkt bestehen.

            Der Anwender sieht ein 2 - geteiltes Fenster :
            a.) Produktliste aus der Haupttabelle, nur 2 joins mit Hersteller und Geräteart.
            b. ) Alle Unterinformationen aus den anderen Tabellen mit Stored - Procedures abgefragt, wenn Afterscroll ausgelöst wird.
            Tempo ist vollkommend ausreichend bei z.zeit 2 Mio Datensätzen und
            100 Infofeldern.
            Die verschiedenen Select werden dann an die Haupttabelle geschickt,
            die Afterscroll - Routine kann man mit etwas Pflege anpassen.

            Gruß Günte

            Comment


            • #7
              ab ca 6-7 Tabellen in einem SQL (daher auch in Views) macht der InterBase Optimierer seinem Namen keine Ehre mehr und verknüpft die Tabellen nicht unbedingt in der Reihenfolge, wie es möglich wäre, d.h. obwohl Inidizes gesetzt sind, werden die ignoriert. Bei der Abfrage über eine Stored Procedure, die in For Select Schleifen die Daten zusammen sucht, kann man die Zugriffsreihenfolge selbst bestimmen. Auch wenn es im Moment so aussieht, das alles recht schnell ist, evtl. macht der Server jetzt schon für einen User alles dicht, wenn dann 10 oder 100 User zugreifen, geht manchmal nix mehr. Gruss Holger www.ibexpert.co

              Comment


              • #8
                Hallo,<br>
                Interbase soll ja Probleme mit joins > 7 oder 8 Tabellen haben,<br>
                speziell die Optimierung hapert etwas (beim join wird nur bei der 1. tabelle ein index benutzt).<br>
                ich würde erst mal prüfen, wie der view optimiert wird (z.B. planalyzer oder ibconsole).<br>
                beim erzeugen des views wird die interne abarbeitung festgelegt, wenn sich an den tabe´llen was ändert (indizes), muss der view neu erzeugt werden.
                <br>
                <br>
                heik

                Comment


                • #9
                  <br>Danke nochmal an alle!<br><br>
                  <b>Günter:</b><br>
                  Klingt einleuchtend, was du da gemacht hast! Sind die 2 Mio. Datensätze auf alle Tabellen verteilt oder allein in der Haupttabelle? Die 100 Infofelder sind dann sicherlich je Produkt auf die anderen verteilt!?<br><br>
                  <b>Holger:</b><br>
                  Das wusste ich noch nicht, dass Interbase-Optimierer bei <i>join</i>-Views ab 7 Tabellen schlapp macht. Danke für den Hinweis, dann hab ich schon ein Punkt mehr, wo wir noch ansetzen können.<br><br>
                  <b>Heiko:</b><br>
                  Auch das mit den Indizes war mir noch nicht richtig klar, wie Interbase das bei <i>joins</i> händelt. Klar ist es logisch, dass man bei derartigen Views die wesentliche Tabelle als erste setzt und alle anderen per <i>join</i> bzw. <i>left join</i> anhängt. Wenn ich aber mehrere Indizes auf der Haupttabelle habe (1. primary key, 2. Namensfeld, ...), werden auch alle genutzt?<br><br>
                  Wir haben auch ein Update-Tool, welche später regelmässig bei Wartungen die meisten Views entfernt und wieder neu erzeugt!<br><br>
                  <b>Noch eine Frage!</b><br>
                  Die Software wird in Delphi programmiert. Wir nutzen als Datenbank-Komponente SDEngine (SQLDirect). Ist hier vielleicht noch Optimierung möglich? Hat jemand mit dieser Komponente schon Erfahrungen gemacht, was das öffnen von grossen Views angeht?<br><br>
                  MfG,<br>Carsten<br&gt

                  Comment


                  • #10
                    Hallo Carsten,

                    Info : 1 HAupttabelle mit 200 000, Detail und Beschreibungstabellen je 200 000 bis 2.000.000, Nachschlagetabellen je 200 - 2000 Datensätze. Insgesamt pro Zeile ca 50 Datensätze der Tabellen, wobei die meisten mit Stored Procedures abgeholt werden.

                    Hinweis, seit die Datenbank auf Firebird 1.0 läuft sind komplexe Abfrage zügiger in der Ausführung. Eventuell greifen die Buffer - Einstellungen der Delphi-Komponenten und der Datenbank hier besser. (Es stand mal so etwas bei sourceforge.net). Ich nutze simpel die mitgelieferten IBX in der Version 5.04.

                    Gruß Günte

                    Comment


                    • #11
                      1.) Mit der Reihenfolge, in welcher die Tabelle aufgeführt werden, kann man die meisten JOINs noch ein wenig optimieren.

                      2.) Es macht durchaus einen Unterschied, welcher JOIN verwendet wird. Ich habe das mal durchgemessen anhand einer Verknüpfung von drei Tabellen, bei denen alle vier möglichen JOINs dieselbe Ergebnismenge gebracht haben.

                      Ausführungszeiten (ohne Query-Plan)

                      INNER JOIN 20,8 ms
                      LEFT OUTER JOIN 5,6 ms
                      RIGHT OUTER JOIN 4000 ms
                      FULL OUTER JOIN 20000 ms

                      Die Verhältnisse mögen sich von Situation zu Situation verschieben, es zeigt sich aber, dass zwischen verschiedenen Formulierungen, die alle dieselbe Ergebnismenge bringen, erhebliche Unterschiede in den Ausführungszeiten bestehen können.

                      Also: Anweisung und deren Plan genau analysieren und dann viel experimentieren

                      Comment

                      Working...
                      X