Announcement

Collapse
No announcement yet.

Große Datenmengen in verknüpfte Tabellen einlesen

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

  • Große Datenmengen in verknüpfte Tabellen einlesen

    Aufgabe:
    Einlesen von sehr vielen Datensätzen aus einer Reihe von ASCII-Dateien in eine INTERBASE-Datenbank mittels eines Delphi-Programms

    Struktur:
    5 mit einander verknüpfte Tabellen mit jeweils n als ungefährer maximaler Datensatzzahl:
    T1: Mitarbeiter (n = 500, einlesen)
    T2: Leistungskatalog (n = 300, vorgegeben)
    T3: Kunden (n = 1000, für diese Aufgabe als vorgegeben zu betrachten)
    T4: erbrachte Leistungen (n = 400000, einlesen)
    T5: erbrachte Arbeitseinheiten (1 Leistung kann gleichzeitig 1-3 Mitarbeiter benötigen, wobei die Verknüpfung von Mitarbeiter und erbrachter Leistung zu speichern ist; n = 600000, einlesen)

    Problem:
    Ab einem n > 20000 für T4 und T5 wird der Einleseprozess sehr träge, oberhalb von 100000 unbrauchbar.

    Analyse:
    Beim Einlesen wird zunächst die Nummer der Leistung anhand des Leistungskatalogs gesucht und der entsprechende Wert in T4 abgespeichert. Danach wird festgestellt, ob der Mitarbeiter schon in T1 vorhanden ist, wenn nicht, hinzugefügt. Schließlich kann die Tabelle T5 um einen Datensatz erweitert werden, mit den Bezügen auf die Tabelle T1 und T2. Da beim Schreiben in T1 und T2 die Datensatznummer noch nicht bekannt ist (wird als Primärindex über Generator aufgebaut), muss zumindest in einer der großen Tabellen für jede Leistung neu positioniert werden (Soft commit, neue Transaktion, Positionierung), was entsprechend lange dauert.

    Die Definition der Datenmengen als unidirektional führte zu keiner nennenswerten Beschleunigung. Auch regelmäßiges Hard-Commit am Ende des Einleseprozesses einer ASCII-Datei erbrachte nichts Wesentliches.

    Momentane Abhilfe: Alle 30000 Datensätze werden die Datensätze exportiert und gelöscht. Das Einlesen der erzeugten Teiltabellen am Ende in eine Gesamttabelle benötigt keine Repositionierungen und erfolgt damit mit zufriedenstellender Geschwindigkeit. Auf Dauer kann das jedoch keine Lösung sein !

    Da das Einlesen DIESER Daten nur von einer Stelle aus erfolgt, erwäge ich die Möglichkeit, die Prozesse der Datenbank zu ignorieren und die Primärindizes von Hand zu erzeugen (d.h. am Anfang des Leseprozesses einer der ASCII-Dateien wird die Nummer des jeweils letzten Datensatzes in T4 und T5 bestimmt und dann im Datenbank-Client inkrementiert). Dies hätte den Vorteil, das die großen Dateien T4 und T5 unabhängig und damit ohne Repositionierungen geschrieben werden könnten, was den Ablauf erheblich beschleunigen sollte.

    Meine Frage:
    1. Gibt es eine elegantere Lösung, die z.B. auch das Einlesen mehrerer Dateien parallel erlaubt ?
    2. Bei der klassischen Methode: ist die unidirektionale Datenmenge immer die optimale ? Wenn nein, welche Buffer Chunks wären optimal zu wählen ?
    3. Würde die Benutzung von Cached Updates einen Geschwindigkeitsvorteil bringen ?
Working...
X