Optimieren Sie PostgreSQL für viele INSERTS- und Bytea-Updates

12

Was wir haben (Software):

  • PostrgeSQL 9.3 mit Basiskonfiguration (keine Änderungen in postgresql.conf)
  • Windows 7 64 Bit

Hardware:

  • Intel Core i7-3770 3,9 GHz
  • 32 GB RAM
  • WDC WD10EZRX-00L4HBAta-Laufwerk (1000 GB, SATA III)

Wir müssen also ungefähr in die DB laden. 100.000.000 Zeilen mit Bytea- Spalte und einfachere 500.000.000 Zeilen (ohne LOBs). Es gibt 2 varcharIndizes für die 1. Tabelle (mit einer Länge von 13, 19) und 2 varcharIndizes für die 2. Tabelle (18, 10 Längen). Es gibt auch Sequenzen für die ID-Generierung für jede Tabelle.

Inzwischen werden diese Vorgänge mit 8 Verbindungen parallel zu einer Stapelgröße von 50 JDBC ausgeführt. Das folgende Bild zeigt die Systemlast: postgresqlProzesse werden nicht belastet . Nach 24 Stunden Laden haben wir nur 10.000.000 Zeilen geladen, was ein sehr langsames Ergebnis ist.

Geben Sie hier die Bildbeschreibung ein

Wir bitten um Hilfe bei der Optimierung der PostrgreSQLKonfiguration zu folgenden Zwecken:

1) Für das ultraschnelle Laden dieser Datenmenge handelt es sich um eine einmalige Operation, sodass es sich möglicherweise um eine temporäre Konfiguration handelt

2) für den Produktionsmodus zum Durchführen einer moderaten Anzahl von SELECTs in diese 2 Tabellen anhand ihrer Indizes ohne Verknüpfung und ohne Sortierung.

Andremoniy
quelle

Antworten:

14

Informationen zur insertLeistung finden Sie unter Beschleunigen der Einfügeleistung in PostgreSQL und Masseneinfügung in PostgreSQL .

Sie verschwenden Ihre Zeit mit JDBC-Batching für insert. PgJDBC macht mit Stapeln nichts Nützliches insert, sondern führt nur jede Anweisung aus . <- Dies gilt nicht mehr für neuere PgJDBC-Versionen, die jetzt vorbereitete Anweisungen stapelweise ausführen können, um die Umlaufzeiten erheblich zu verkürzen. Aber es ist immer noch besser:

Verwenden Sie COPYstattdessen; siehe PgJDBC-Stapelkopie und die CopyManager. Bezüglich der Anzahl gleichzeitiger Lader: Streben Sie ein Paar pro Festplatte an, wenn die Vorgänge an die Festplatten-E / A gebunden sind. Acht ist wahrscheinlich das Beste, was Sie wollen.

Für Ihren "Produktionsmodus" empfehle ich, ein Datenbeispiel zu laden, die erwarteten Abfragen einzurichten und die explain analyzeLeistung zu untersuchen. Verwenden Sie die enable_Parameter nur zu Testzwecken, um verschiedene Planauswahlen zu untersuchen. Stellen Sie die Abfrage Planer Kostenparameter ( random_page_cost, seq_page_cost, effective_cache_size, usw.) in geeigneter Weise für das System, und stellen Sie sicher , shared_buffersentsprechend eingestellt ist. Überwachen Sie weiter, während Sie eine simulierte Produktionsauslastung mithilfe des auto_explainModuls, der log_min_duration_statementEinstellung, der pg_stat_statementsErweiterung usw. hinzufügen .

Einzelheiten finden Sie im PostgreSQL-Benutzerhandbuch. Ich schlage vor, hierher zurückzukehren, wenn Sie ein konkreteres Problem mit explain analyzeDetails zur Ausführung von Abfragen usw. haben.

Craig Ringer
quelle
1
Dies ist eine erstaunliche Antwort! Danke.
Jan Mares