2010-08-09 12 views
9

Mam strukturę danych, która wygląda tak:Jak zaimportować * ogromne * porcje danych do PostgreSQL?

Model Place 
    primary key "id" 

    foreign key "parent" -> Place 
    foreign key "neighbor" -> Place (symmetryc) 
    foreign key "belongtos" -> Place (asymmetric) 

    a bunch of scalar fields ... 

Mam ponad 5 milionów wierszy w tabeli model i muszę wstawić ~ 50 mln wierszy w każdej z dwóch kluczy obcych tablicach. Mam SQL pliki, które wyglądają tak:

INSERT INTO place_belongtos (from_place_id, to_place_id) VALUES (123, 456); 

i są one o 7 Gb każda. Problem polega na tym, że gdy wykonuję psql < belongtos.sql, zajmuje mi on około 12 godzin zaimportować ~ 4 miliony wierszy na moim procesorze AMD Turion64x2. OS to Gentoo ~ amd64, PostgreSQL to wersja 8.4, skompilowany lokalnie. Katalog danych jest monterem bindów, znajdującym się na mojej drugiej rozszerzonej partycji (ext4), co, jak sądzę, nie jest wąskim gardłem.

Podejrzewam, że wstawienie relacji klucza obcego trwa tak długo, ponieważ psql sprawdza ograniczenia klucza dla każdego wiersza, co prawdopodobnie powoduje niepotrzebne obciążenie, ponieważ wiem na pewno, że dane są poprawne. Czy istnieje sposób na przyspieszenie importu, tj. Tymczasowe wyłączenie sprawdzania ograniczenia?

+0

tak, ale myślę, że tylko w 8,4+ hmm muszę to sprawdzić ... – xenoterracide

Odpowiedz

16
  1. Upewnij oba klucz obcy ograniczenia są DEFERRABLE
  2. Używaj COPY załadować swoje dane
  3. Jeśli nie można użyć kopii, użyj do prepared statement do wstawienia.
  4. Ustawienia konfiguracji Propper również pomogą, sprawdź ustawienia WAL.
+4

+1 dla COPY, robi ogromną różnicę w DB-ach, które przebiegłem przez te tony insertów danych regularnie ... – Ryley

+0

Już używam DEFERRABLE. KOPIUJ to rzecz, której szukałem, dzięki! –

+0

Korzystanie z opcji odroczenia to jedno, naprawdę korzystanie z tej opcji to kolejna rzecz: INICJALNIE ODSTĄPIONA lub USTAWIONO WSZYSTKIE ODMÓWIONE; –

0

Odpowiedź brzmi: tak ... Depesz wrote an article here on deferrable uniqueness. Niestety wydaje się, że jest to funkcja 9.0.

hmm ... Może ten artykuł nie dotyczy Twojej sytuacji? Wygląda na to, że przez jakiś czas byliśmy w stanie set constraints to deferred ... Domyślam się, że wyjątek jest wyjątkową sytuacją (kalambur przeznaczony).

+0

Klucze obce są już odroczone w starszych wersjach, nie ma problemu. –

+0

Hej, ucz się czegoś nowego każdego dnia;). – xenoterracide

+0

Artykuł z Depesz opisuje odłożone odroczenia * ograniczenia * unikalne * (np. Klucz podstawowy), które nie podlegały odroczeniu przed 9.0, np. uruchomić polecenie UPDATE id = id + 1 (gdzie id jest kolumną PK) Zwykłe więzy FK mają zawsze "odroczone". Ustawienie ograniczenia do odroczenia nie zapobiegnie sprawdzeniu, to tylko _delay_ sprawdzenie do końca transakcji (tj. Po zatwierdzeniu jest wykonywane) –

Powiązane problemy