Mam dwie tabele bazy danych. Jeden zawiera setki milionów rekordów. Nazwijmy to history
. Drugi jest obliczany codziennie i chcę skopiować wszystkie jego rekordy do history
jednego.
To, co zrobiłem, to uruchomić:
INSERT INTO history SELECT * FROM daily
I przez jakiś czas to działało, ale zaczęło być coraz wolniejsze w miarę wzrostu liczby rekordów. Teraz mam około 2 milionów płyt, które muszą być skopiowane z daily
aby history
w jednej operacji, a to trwa zbyt długo, aby kompletne.
Czy istnieje inny, bardziej wydajny sposób kopiowania danych z jednej tabeli do drugiej?
źródło
Zrzuć tabelę w formacie csv
użyj polecenia KOPIUJ, które jest znacznie wydajniejsze w przypadku dużych ilości danych.
Sprawdź dokumenty postgres na http://www.postgresql.org/docs/current/static/sql-copy.html, aby uzyskać więcej informacji
źródło
history
Tabela zawiera 160 milionów wierszy , a my dodajemy kolejne 3 miliony wierszy.Problem dotyczył indeksów.
history
Stół miał 160m indeksowanych wiersze. Uruchomienie jednego z nichCOPY FROM
lubINSERT INTO .. SELECT
zajęło dużo czasu, aby nie wstawiać wierszy, ale aktualizować indeksy. Kiedy wyłączyłem indeksy, zaimportowałem 3M wierszy w 10 sekund. Teraz muszę znaleźć szybszy sposób reindeksacji dużego stołu.źródło
Możesz użyć narzędzia psql , mogę być wydajny, ponieważ:
Możesz także napisać skrypt powłoki.
źródło
To oczywiście nie jest dokładna odpowiedź na twoje pytanie, ale jeśli nie potrzebujesz dostępu do
history
tabeli, możesz również wygenerować zrzut SQL:Następnie można użyć narzędzia takiego jak
git
obliczyć różnicę i przechowywać ją wydajnie.Jest to przydatne, ponieważ większość części w bazie danych nie zmienia się codziennie. Zamiast przechowywać całą kopię na każdy dzień, można zapisać różnicę między dwoma dniami.
Możesz użyć
crontab
zadania, dzięki któremu zrzut jest przetwarzany codziennie.źródło