Announcement

Collapse
No announcement yet.

Abgleich Access mit Interbase

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

  • Abgleich Access mit Interbase

    Hallo,<P>
    ich habe hier ein Programm laufen bei dem die Daten auf einem Interbase Server sind. Nur muß ich regelmäßich einmal am Tag Daten aus einer Anderen Anwendung übernhemen. Die Daten wirden mit in Form einer Access Datenbank übergeben. Ich in Datenbank sind unter anderem 3 Felder welche auch in meiner Datenbak sind. Nun soll ich 3 Termine aus 3 Feldern übernehemn. Ich habe dazu eine Verbindung mitte ADO zu Access gemacht. Die Daten habe ich eine Table aus der Accessdatenbank. Die drei Termine miß ich nun schnellstene in meine Datenbank bekommen. Zur Zeit sind dort leider ca. 12.000 Datensätze vorhanden. Ich habe also eine Schleife welche die Tabelle von Anfang bis zum Ende durchläuft. <P>
    Jetzt kommt mein Problem:<P>
    Ich habe dann eine TIBQuery benutzt den Datensatz gesucht (Anhand von der 3 Kriterien) und mittes eine Update SQL die Daten in meine Tabelle geschrieben oder das ganze mit einen TIBDataSet.<P>

    Hier kommt nun meine Problem:<P>
    Das ganze dauert so ca 4 Stunden (Pentium 4 2 GHZ !)<P>
    <P>
    Gibt es eine schnellere Möglichkeit ?<P>
    <P>
    Cu Tanja<P>

  • #2
    Hallo,

    wenn es sich bei der Ziel-Datenbank um den MS SQL Server oder die MSDE handelt würde, wäre das Ganze sehr einfach. Da der MS SQL Server direkt über einen OLE DB-Provider auf beliebige anderen Datenbanken zugreifen kann, holt er sich die Daten direkt über den SQL-Weg:
    <pre>
    UPDATE
    MSSQL_Zieltabelle
    SET
    Feld1 = a.Feld1,
    Feld2 = a.Feld2
    FROM
    OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'C:\Database\ACCESSDatenbank.mdb';'admin';'', ExportTabelle) AS a
    WHERE
    KeySpalte = a.KeySpalte
    </pre>
    Beim InterBase fehlt ein derartige Feature, so dass das Programm selbst die Daten übertragen muss.

    &gt;Ich habe also eine Schleife welche die Tabelle von Anfang bis zum Ende durchläuft.

    Auf welcher Seite läuft die Schleife (ACCESS-Datenbank oder InterBase-Datenbank)? Wie viele Datensätze sind in der ACCESS-Tabelle? Werden die Schreibzugriffe auf den InterBase in eine Transaktion gekapselt

    Comment


    • #3
      Hallo Andreas,<P>
      die Schleife läuft auf der Seite von Access. Es können in der Accesstabelle Daten sein, welche nicht in der Interbase Tabelle sind. Dieses möchte ich natürlich bei dieser Aktion auch gleich mit herrausfinden .In der Access Tabelle sind leider ca 12.000 Datensätze vorhanden. Ich machen als Transaktion nachenden der Datensatz geschrieben worden ist immer ein Commit?ß
      <P>
      Cu Tanj

      Comment


      • #4
        Hallo,

        wenn das Programm mit der Einstellung <b>clUseServer</b> für die Eigenschaft <b>CursorLocation</b> auf die ACCESS-Datenbank zugreift, und dort jeweils nur einen Wert ausliest, wie schnell ist die Schleife mit den 12.000 Datensätzen fertig

        Comment


        • #5
          Hallo Andreas,
          wenn ich die Schleife der Accesstabelle einfach nur durchlaufen lassen ohne die Daten in die Tabelle auf dem IB Server zu schreiben dauer es ca. 4 Sec.

          Tanj

          Comment


          • #6
            Hallo Tanja,

            &gt;..dauert es ca. 4 Sec.

            das ist doch schon mal etwas, denn dann gibt es nur noch 2 Ursachen für die extrem lange Ausführungszeit von 4 Stunden. Zur Eingrenzung der Ursachen würde ich als nächstes folgendes machen:

            Bisher hast Du jeden UPDATE-Zugriff auf den InterBase in eine eigene Transaktion gekapselt. Ich würde daher die InterBase-Zugriff in eine Transaktion verpacken, die vor dem Eintritt in die Schleife gestartet und erst nach dem Verlassen der Schleife über COMMIT verlassen wird. Und damit auch die zweite potentielle Fehlerursache ausgemerzt wird, ersetze TIBQuery/TIBDataSet durch <b>TIBSQL</b>, um die UPDATE-Anweisung in der Schleife zum InterBase zu schicken.

            P.S: Unter welcher Windows-Version tritt das Problem auf

            Comment


            • #7
              Hallo Andreas,<P>
              ich werde es mal testen. Als Windows setze ich Windows 98 ein. Das fertige Programm wird dann aber auf Windows 2000 Server laufen <P>

              Vielen Dank für den TIP<P>
              Tanj

              Comment


              • #8
                Hallo Andreas<P>
                leider habe hier eine Tipfehler gamcht. Es dauert nicht 4 sc. sondern 24 sec.<P>
                Ich habe es mittels einer TIBSQL versucht. Leider hat auch dieses nicht mur Erfolgt geführt. Für 50 Datensatz benötige ich ca. 1 Minuten. So komme ich bei 12.000 auf meine 4 Stunden.<P>
                Als Windows setze ich Windows 98 ein. Delphi ist in der Version 5 vorhanden . Die iBX Komponenten habe ich schon einen neue Version. Ich glaube 4.52.<P>
                Hast du villeicht noch einen Tip für mich ??
                <P> Tanj

                Comment


                • #9
                  Hallo,

                  wie sieht die konkrete Implementierung der Schleife aus

                  Comment


                  • #10
                    Hallo Andreas,<P>
                    Ich hole mir die Daten in einer ADO Tabelle von Access. Dann druchlaufe ich eine Schleife mit der Anzahl der Datensätze (RecordCount auf die Access Tabelle).<P>
                    AdoTabelle.First; <P>
                    For I := 1 to AdoTabelle.RecordCount do<P>
                    begin<P>
                    //Hier wird nun der SQL für das Update bei Interbase erzeugt.<P>

                    AdoTabelle.Next<P>
                    end;<P>

                    Cu Tanja<P&gt

                    Comment


                    • #11
                      ... und genau der Teil mit dem Kommentar verursacht doch das Problem?<p>
                      Schöne Grüße, Mario Noac
                      Schöne Grüße, Mario

                      Comment


                      • #12
                        Hallo Mario,<P>
                        ja wenn ich die Daten in die Interbase Datenbak schreiben. Dann dauert es je Datensatz (mittels Update Tabelle) fast 1 sec.

                        <p>
                        Tanj

                        Comment


                        • #13
                          Poste doch mal ein bischen Code, was für Code Du ausführst, der genau diese Sekunde lang dauert ;
                          Schöne Grüße, Mario

                          Comment


                          • #14
                            Hallo Mario,<P>
                            leider habe ich den Code zur Zeit nicht zur Hand. Na Ja ich versuch es einfach mal so. <P>

                            Es wird eine TIBSQL benutzt. Zuerst wird der SQL gelöscht. Dann wird eine neuer SQL erzeugt. Dieses ist notwendig, da es untershiedliche Parameter bei der Where geben kann,<P><P>
                            Update Table Test<P>
                            Set DatumA = '+DatumA aus der Accesstabelle über ADO<P>
                            Set DatumB = '+DatumB aus der Accesstabelle Über ADO<P>
                            Where KriteriumA = '+KriteriumA aus der Accesstabell<P>
                            Ab hier kann dann eine oder mehrere and KriteriumB = '+KriterimB aus der AccessTabelle kommen.<P>
                            Je nachen Art des Datensatz kommen hier 3 bis 5 Kriterien bei der Where.<P>

                            Solange ich dann die TIBSQL nicht ausführe läuft der Code sehr schnell ab. Wenn ich Jedoch nun den Code ausführe und der SQL Server muß etwas machen, dann dauert es je Datensatz ca. 0.75 sec. Ich dachte schon das das erzegen das SQL Befehles so lange dauert. Aber es ist nicht so.
                            <P>

                            Tanja<P&gt

                            Comment


                            • #15
                              Hallo Tanja,<p>
                              Guter Rat teuer. Mit IB kenne ich mich nicht aus, dass ist aber für diesen Fall vermutlich egal...<p>
                              Ich nehme mal an, dass die zu aktualisierende Tabelle sehr groß ist, um wieviel Datensätze/MB geht es denn insgesamt? Kannst Du nicht irgendwas zusammenfassen? Du läufst im Moment Deine Access-Tabelle durch und sagst bei jedem Datensatz, dass IB seine komplette Tabelle entsprechend ändern soll, dass dauert natürlich.<p>
                              Geschickter wäre es, wenn Du zu Beginn erst mal die betroffenen Datensätze in IB generell einschränken könntest und dann mit einer parametrisierten Query nur noch auf dieser Datenmenge weiter machst. Jedoch fällt es mir schwer, dafür aus der Ferne universelle Tipps zu geben. Schaue doch mal, ob Du Dein Update nicht in einen SQL mit Parametern drücken kannst, den du dann einmal mit Prepare vorbereitest und dann in Deiner Schleife nur noch die Parameter änderst. Das sollte IB Chancen für Optimierungen geben.<p>
                              Zu Prüfen ist sicher noch, ob alle Kriterienschlüssel einen geeigneten Index haben oder ob es nicht ein besseres Kriterium gibt.<p>
                              Schöne Grüße, Mario Noac
                              Schöne Grüße, Mario

                              Comment

                              Working...
                              X