Wyobraź tabelę o następującej strukturze na PostgreSQL 9.0:PostgreSQL: Ładowanie danych do schematu Gwiazd skutecznie
create table raw_fact_table (text varchar(1000));
Dla uproszczenia Wspomnę tylko jedną kolumnę tekstu, w rzeczywistości ma on tuzin. Ta tabela ma 10 miliardów wierszy, a każda kolumna ma wiele duplikatów. Tabela jest tworzona z pliku płaskiego (csv) przy użyciu polecenia KOPIUJ Z.
Aby zwiększyć wydajność Chcę przekształcić do następującej strukturze schematu gwiazda:
create table dimension_table (id int, text varchar(1000));
Fakt tabela zostanie następnie zastąpiony fakt tabeli tak:
create table fact_table (dimension_table_id int);
mojego obecnego sposobu to zasadniczo uruchomić następujące zapytanie, aby utworzyć tabelę wymiarów:
Create table dimension_table (id int, text varchar(1000), primary key(id));
następnie stworzyć wypełnić tabelę wymiaru używam:
insert into dimension_table (select null, text from raw_fact_table group by text);
Następnie trzeba uruchomić następujące zapytanie:
select id into fact_table from dimension inner join raw_fact_table on (dimension.text = raw_fact_table.text);
Wystarczy wyobrazić sobie straszne wydajność dostaję porównując wszystkie sznurki do wszystkich pozostałych strun kilku czasy.
Na MySQL mogłem uruchomić procedurę składowaną podczas kopiowania z. Może to spowodować utworzenie skrótu łańcucha, a wszystkie kolejne porównania łańcuchów są wykonywane na mieszaniu zamiast długiego nieprzetworzonego łańcucha. Nie wydaje się to możliwe w PostgreSQL, co mam zrobić?
Przykładowe dane byłyby plik CSV zawierający coś takiego (używam cudzysłowu również wokół liczb całkowitych i podwaja):
"lots and lots of text";"3";"1";"2.4";"lots of text";"blabla"
"sometext";"30";"10";"1.0";"lots of text";"blabla"
"somemoretext";"30";"10";"1.0";"lots of text";"fooooooo"
Ile czasu to zajmuje? Jak długo się spodziewałeś? –
Nigdy nie skończyłem go przy użyciu wspomnianej ilości danych. Ale na 15 milionach rzędów zajęło to kilka godzin. Sprawdziłem już wszystkie standardowe funkcje optymalizacji serwera (work_mem itd.), Więc szukam innego sposobu, aby osiągnąć ten sam wynik. – David
Wyślij dane próbki i DDL. –