Announcement

Collapse
No announcement yet.

Performenc Interbase

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

  • Performenc Interbase

    Hallo zusammen!

    folgende Umgebung:

    Server: WinNt 4.0 Interbase 5.5<p>
    Client: WinNt 4.0 Interbase Client

    Software Server: Applikation (Delphi 5) ließt (via BDE) stündlich <br> 70.000 Datensätze aus ASCII-Dateien in eine Tabelle.
    <p>
    Software Client: Import aus "alten" dBase-Dateien (ca. 1.200.000 <br>
    Datensätze) in die gleich Tabelle wie die Anwendung auf dem Server.
    <p>
    Problem: Leider werden nur ca. 80,000 Datensätze je Stunde in die <br>
    Tabelle geschrieben. ibServer benötigt etwa 40 Prozent der <br>
    Systemresourcen, jedoch ist die CPU des Servers "nur" zu 75 Prozent<br> ausgelastet.
    <p>
    Weiß jemand, wie man Interbase tunen kann, sodaß in Zukunft auch mehrere<br>
    User mit vernünftiger Performance arbeiten können?
    <p>
    Vielen Dank, für die Mühe, die ich Euch mache!

  • #2
    Evtl. mußt Du nicht deinen Server tunen, sondern deine Client-Applikation. 80000 Datensätze pro Stunde bedeutet 22 Datensätze pro Sekunde, also ca. alle 45 ms ein Datensatz. Bei meiner Umgebung (SQL-Server 7.0 auf NT 4.0 mit P-III 500, 128 MB komme ich auf ca. 20 ms pro Datensatz bei Client/Server auf unterschiedlichen Rechnern)

    Evtl. mußt Du versuchen mit mehreren Threads die Daten in die Datenbank zu schreiben. Dazu ein paar Fragen um die Performance-Bremse genauer herauszufinden:

    - Laufen der Client und der Server auf einer Maschine. Falls nein kann ein Test mit Client und Server auf einer Maschine durchgeführt werden? Ergibt sich dabei eine Steigerung der Datensatz-Rate?

    - Was passiert, wenn 2 Instanzen deiner Applikation (unterschiedliche Datenbestände) gleichzeitig die Daten in den Server schreiben? Ist dann die Anzahl der "erledigten" Datensätze pro Stunde pro Applikation immer noch so hoch wie mit einer Applikation? Wenn ja, dann benötigt die Kommuikation Client -> Server für jeden Datensatz eine bestimmte Zeit (z.B. für Validierung auf Clientseite, Serverseite, Übertragung über Netz) und die Performance kann durch paralles Schreiben von Datensätzen mit Threads beschleunigt werden

    Comment


    • #3
      Vielen Dank für Deine schnelle Antwort.

      Ich sehe das Problem weniger in meiner Applikation oder Hardware, sondern vielmehr im Tuning von Interbase.

      Zu dieser Behauptung komme ich, weil mit dBase oder Paradox etwa 5 mal mehr Datensätze je Stunde geschrieben worden sind (auch mit mehreren Instanzen. Allerdings läßt die Perfomens bei etwa 600.000 Datensätzen (dBase) extrem nach, sodaß ich nach einer anderen Datenbank greifen mußte.

      Weiterhin verursacht Interbase, wie oben beschrieben, etwa die gleiche Last auf dem Server, egal ob eine oder mehrere Applikationen arbeiten, die Anzahl der eingefügten Datensätze steigt dabei nur unwesentlich.

      zu Deinen Fragen: Es werden mehr Datensätze je Sekunde eingfügt, wenn die Applikation auf dem Server läuft. Laufen beide Applikationen auf dem Server, sinkt die "Insertrate" extrem (von 80.000 auf etwa 50.000 Datensätze je Stunde). Deshalb schließe ich auch Netzwerkprobleme aus

      Comment


      • #4
        Hallo,

        sowohl dBASE als auch Paradox kennen keine Transaktionen, ausserdem sind ISAM-Datenbanken bei dieser Aufgabe bis zu einer bestimmten Grösse generell schneller als SQL-Datenbanken, weil beim Massenimport der datensatzorientierte Zugriff effektiver ist.

        Die interessanten Fragen beim InterBase sind <br>
        a) Welcher Isolation Level wird verwendet (tiRepeatableRead oder tiReadCommitted)? Bei häufig gestarteten Transaktionen ist tiRepeatableRead effektiver.

        b) Wird jeder INSERT-Vorgang in eine eigene Transaktion verpackt? Wenn ja, wird hier der Grund für das träge Verhalten liegen.

        c) Treten gleichzeitig viele kurze Transaktionen sowie eine sehr lange Transaktion (mit vielen INSERTs) auf? Kann es in dieser Umgebung zu ROLLBACKS kommen? In diesem Fall würde der InterBase einen SWEEP auslösen, wenn der konfigurierte Schwellwert für die Differenz zwischen OIT und OAT erreicht wird.

        d) Ist für die InterBase-Datenbank <b>Enable forced writes</b> aktiviert? ("<i>Performing forced writes ensures data integrity and safety, but will slow performance. In particular, operations which involve data modification will be slower.</i>"). Beim Massenimport von Daten kann dies deaktivert werden - da der Import im Fehlerfall wiederholt werden kann.

        e) Welches Netzwerkprotokoll wird verwendet und sind Performanceunterschiede zwischen TCP/IP und NetBEUI feststellbar?
        &#10

        Comment


        • #5
          Hallo Herr Kosch,

          zu Ihren Fragen:

          a) Die Frage nach dem Isolationslevel kann ich erst heute abend beantworten.

          b) Um eine einfache Umstellung der Software zu erreichen, habe ich weiterhin die Komponenten TDatabase und TTable verwendet. Folgende Verarbeitungslogik (vereinfacht) findet statt:

          readln (seq. File)<br>
          repeat<br>
          Table.EditKey;<br>
          ....<br>
          if not Table.GotoKey then<br>
          begin<br>
          Table.Append<br>
          ....<br>
          try<br>
          Table.Post<br>
          except<br>
          Table.Cancel<br>
          end; // end try<br>
          end; // end if<br>
          readln (seq. File)<br>
          until EOF (seq. File)<br>

          ich gehe davon aus, daß ein Post ein Commit beinhaltet, weiterhin gehe ich davon aus, daß ich auf SQL umstellen sollte und im Abstand von einigen (wieviel???) Datensätzen ein Commit setzen sollte --> Frage: wie ermittle ich das Optimum zwischen Sicherheit, Caching und Perfomenc???
          Anderenseits: kann der Einsatz von Stored Procedure eine höhere Perfomec bringen?

          c) Rollbacks sind fast auszuschließen, da maximal 2 Prozesse schreibend auf diese Tabelle zugreifen, alle anderen lediglich lesend. Nach Schätzungen wird es täglich 2 Millionen Transaktionen auf die Tabelle geben, davon sind etwa 400.000 Insert

          d) Enable forced writes ist aktiviert, mir fehlt etwas der Mut zur Deaktivierung.

          e) Als Netzwerkprotokol wird NetBEUI verwendet, über TCP/IP habe ich noch keinen Versuch gestartet, wird heute noch nachgeholt

          Comment


          • #6
            Hallo,

            die Antwort b) deutet darauf hin, das der AutoCommit-Modus der BDE ausgenutzt wird. Das ist zwar für uns als Entwickler sehr bequem, da sich die VCL+BDE um alles kümmert - aber in diesem konkreten Fall überwiegen die sich daraus ergebenden Nachteile. Der AutoCommit-Modus bewirkt, das bei <b>jedem</b> Datensatz die folgenden Schritte ablaufen: <br>
            1. Transaktion wird auf dem InterBase gestartet <br>
            2. Ein Datensatz wird eingefügt. <br>
            3. Transaktion wird auf dem InterBase beendet.<br>
            Das Starten einer neuen Transaktion verursacht auf jedem SQL-Server einen gewissen Aufwand, der in diesem Fall unnötig ist.

            Ich würde daher als erstes dafür sorgen, das ca. 100..200 Datensätze in einer Transaktion in die InterBase-Datenbank geschrieben werden. Da auch TTable alle Anweisungen in SQL übersetzen muss und nur bei kleinen Ergebnismengen (d.h. Filter ist aktiv) effektiv arbeitet, ist es besser, eine TQuery <b>vor</b> dem Start der Schleife mit <b>Prepare</b> einmalig vorzubereiten. Für jeden Datensatz müssen dann nur die Parameter übergeben werden - die abgeschickte SQL-Anweisung bleibt vom Aufbau her gleich, so das ein Prepare ausreicht. In diesem Fall (Prepare wird vor der Schleife aufgerufen) bringt auch eine Stored Procedure nur geringe Performancevorteile.

            Mit dem SQLMonitor kann man sich die Zahl der Aufrufe, die zum InterBase gehen, mitprotokollieren lassen. Allein von der Anzahl dieser Protokolleinträge können die Auswirkungen gut abgeschätzt werden (je weniger Zeilen dort auftauchen, um so besser).

            Zum Test kann man probieren, ob der Einsatz von <b>TBatchMove</b> die gegenwärtige Situation verbessert. Da die Quelldaten im dBASE-Format vorliegen, kann TBatchMove automatisch ein Update/Insert in eine InterBase-Datenbank durchführen. Ausserdem erlaubt in diesem Fall die BDE-Konfiguration für den InterBase-Treiber, dass der <b>BATCH COUNT</b>-Wert von 200 (Anzahl der innerhalb einer Transaktion einzufügenden Datensätze) variiert werden kann. Aber auch hier würde ich mich im SQLMonitor davon überzeugen, ob tatsächlich mehrere Datensätze in eine Transaktion verpackt werden

            Comment


            • #7
              Hallo Herr Kosch,

              vielen Dank für Ihre umfassende Antwort.

              Am Wochende werde ich die Applikation umschreiben. Ich werde über den Erfolg berichten.

              Die Änderung des Netzprotokolls hat keinen Effekt gehabt

              Comment


              • #8
                Hallo,

                folgende Umstellungen habe ich vorgenommen:

                - laden der seq. Dateien in ein nichtindiziertes dBase File<br>
                - aus dem dBase-File nach Interbase wird nun via BatchMove geladen

                Effekt: 70.000 Datensätze in ca. 15 Minuten verarbeitet

                Vielen Dank für Eure Hilfe!!

                Comment

                Working...
                X