Immaginate una tabella con la seguente struttura su PostgreSQL 9.0:PostgreSQL: Caricamento dati in schema a stella in modo efficiente
create table raw_fact_table (text varchar(1000));
Per ragioni di semplificazione Cito solo una colonna di testo, in realtà ha una dozzina. Questa tabella ha 10 miliardi di righe e ogni colonna ha molti duplicati. La tabella viene creata da un file flat (csv) utilizzando COPY FROM.
per aumentare le prestazioni voglio convertire al seguente struttura schema a stella:
create table dimension_table (id int, text varchar(1000));
La tabella dei fatti sarebbe quindi essere sostituito con una tabella dei fatti come la seguente:
create table fact_table (dimension_table_id int);
mio metodo attuale è essenzialmente eseguire la query seguente per creare la tabella delle dimensioni:
Create table dimension_table (id int, text varchar(1000), primary key(id));
poi per creare riempire la tabella della dimensione che uso:
insert into dimension_table (select null, text from raw_fact_table group by text);
In seguito ho bisogno di eseguire la seguente query:
select id into fact_table from dimension inner join raw_fact_table on (dimension.text = raw_fact_table.text);
Basta immaginare le prestazioni orribili ottengo confrontando tutte le stringhe per tutte le altre stringhe diverse volte.
Su MySQL potrei eseguire una stored procedure durante il COPY FROM. Questo potrebbe creare un hash di una stringa e tutto il successivo confronto tra stringhe viene eseguito sull'hash invece della lunga stringa raw. Questo non sembra possibile su PostgreSQL, cosa faccio allora?
dati campione non sia un file CSV contenente qualcosa come questo (io uso le virgolette anche intorno interi e raddoppia):
"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"
Quanto ci vuole? Quanto tempo ti aspettavi che ci volesse? –
Non l'ho mai finito usando la quantità di dati menzionata. Ma su 15 milioni di file ci sono volute diverse ore. Ho già esaminato tutte le cose standard di ottimizzazione del server (work_mem ecc.), Quindi sono in cerca di un metodo diverso per ottenere lo stesso risultato. – David
Invia dati di esempio e DDL. –