Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Import einer grossen Tabelle - Optimierung (https://www.delphipraxis.net/152132-import-einer-grossen-tabelle-optimierung.html)

idefix2 12. Jun 2010 10:31

Datenbank: Firebird • Version: 2.1 • Zugriff über: UIB

Import einer grossen Tabelle - Optimierung
 
Ich möchte viele Daten in eine Firebird Datenbank importieren, die Haupttabelle hat etwas über 100000 Datensätze, drei Nebentabellen vielleicht je ca 20000.

Ich lese jeweils eine Zeile aus dem Importfile ein und erzeuge dann einen datensatz in der haupttabelle und maximal einen Datensatz in jeder der drei anderen Tabellen (mittels update or insert Statement). Zu jedem erzeugten Datensatz in jeder dieser Tabellen wird ein weiterer Datensatz mittels Trigger in einer 5. Tabelle erzeugt.

Ich bilde mir ein, alle nötigen Indizes erstellt zu haben. Trotzdem wird das Programm mit zunehmender Tabellengrösse dramatisch langsamer. Was kann man machen, um das zu verhindern?

Natürlich sind die Indizes bei der Erstellung auf eine leere Datenabnk hin "optimiert". Wäre es sinnvoll, alle paar Tausend Datensätze die Indizes zwecks Optimierung neu zu erstellen?

Wie wirkt sich die Transaktionsgrösse aus? Ich starte alle 500 Importzeilen (in Summe ca 2000 inserts in die verschiedenen Tabellen) eine neue Transaktion.

Bernhard Geyer 12. Jun 2010 12:34

AW: Import einer grossen Tabelle - Optimierung
 
Zitat:

Zitat von idefix2 (Beitrag 1028323)
Ich bilde mir ein, alle nötigen Indizes erstellt zu haben. Trotzdem wird das Programm mit zunehmender Tabellengrösse dramatisch langsamer. Was kann man machen, um das zu verhindern?

Definiere trastisch? Wie schaut die Transaktionsverwaltung aus? (Alles Imports in einer Transaktion) Wie schaut der verfügbare Speicher der DB aus (Richtiger dedizierter Server oder "läuft so nebenbei auf Enwicklungsrechner"? Festplatten-System (0815 SATA oder RAID)? ...

Zitat:

Zitat von idefix2 (Beitrag 1028323)
Natürlich sind die Indizes bei der Erstellung auf eine leere Datenabnk hin "optimiert". Wäre es sinnvoll, alle paar Tausend Datensätze die Indizes zwecks Optimierung neu zu erstellen?

Bei einer normalen DBMS ist das nicht nötig. Nur wenn ein DBMS "mist" beim Aufbau des Index macht ist sowas nötig.

Zitat:

Zitat von idefix2 (Beitrag 1028323)
Wie wirkt sich die Transaktionsgrösse aus? Ich starte alle 500 Importzeilen (in Summe ca 2000 inserts in die verschiedenen Tabellen) eine neue Transaktion.

Kommt auf die Ressourcenparameter der DB an (Verfügbarer RAM, Geschwindigkeit Festplattensystem, ...)

schlecki 12. Jun 2010 14:13

AW: Import einer grossen Tabelle - Optimierung
 
wobei man bei einem Import die Indices normalerweise ausschaltet und erst nach dem Import wieder aktiviert. Dadurch dürfte der eigentliche Import schneller laufen. FKs würde ich eventuell nicht ausschalten, das kommt dann immer auf die Daten an.

alzaimar 12. Jun 2010 15:08

AW: Import einer grossen Tabelle - Optimierung
 
Wenn Du aus den zu importierenden Daten ohne großen Aufwand eine Textdatei erstellen kannst, sollte bulk insert die schnellste Möglichkeit sein.

idefix2 12. Jun 2010 18:48

AW: Import einer grossen Tabelle - Optimierung
 
Danke für die Antworten - Das Problem hat sich erledigt - meine eigene Dummheit: Wenn man bei einem Update Statement auf die Where Klausel vergisst, dann tut so ein Befehl bei jedem Aufruf viel mehr, als man sich vorstellt, und zwar umso mehr mehr, je voller die Tabellen sind :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz