Sono curioso di sapere se Davide per qualche motivo deve
*ripetutamente* caricare questi dati. Altrimenti io
aspetterei quei 10 minuti e mi metterei l'anima in pace.
Chris,
no quei dati li devo caricare una sola volta, non era quello il
problema
Mi interessava capire.
Ah, ok.
Beh, legittimissimo
Capire come mai un db ci mette molto piu' (circa 2-5 volte)
che la semplice scrittura su disco dei dati.
Infatti se mysql e postgres ci mettono >10 minuti (a seconda
anche di come committi ... committando ad ogni insert si arriva anche
a 30-40 minuti)
per esempio hsqldb (db puro java :-))) ce ne mette 5 minuti! Questo e'
il tempo vicino a quello
di scrittura sull'hard disk. (lui poi ha problemi su alcune query)
Allora mi chiedevo, come mai 2 super banche dati come mysql e postgres
ci mettono
moolto di piu'.
Io anzi avrei pensato ci avrebbero messo di meno in quanto non
avrebbero
scritto subito tutti i record su disco ma gli avrebbero tenuti una
parte in memoria.
Invece non e' cosi.
Non so se dalla vostra esperienza anche avete notato questa cosa.
Probabilmente io presumo il tempo potrebbe derivare da una delle
seguenti cose:
A) transazioni: il fatto che uno possa fare rollback richiede alla
banca un lavoro aggiuntivo?
isolamento richiede che diverse sessioni vedano record diversi?
B) affidabilita: probabilmente il db deve essere in grado di
ripristinare la situazione anche in
caso di spegnimento "brutale" della macchina, quindi
probabilmente deve scrivere
dei log su disco di ogni comando sql e non piu' tenere dati
inseriti solo in memoria?
C) primary, unique, foreign key contraint check?
Che sara' per questo che hanno introdotto i comandi spiegati sopra
da Massimo
e il comando copy in postgresql ...
Si`, essenzialmente si`. a), b) e c) valgono.
Un DB relazionale tradizionale eccella su fronti diversi: quando i tuoi
dati diventano piu` grande della tua RAM, se hai tanti accessi
concorrenziali, se ti serve l'isolamento (transazioni), se ti serve
robustezza rispetto a crash ecc. ecc. Insomma giusti i punti che citi
tu.
Infine c'e` un overhead "contabile": 1 int e 2 double sarebbero 20 byte,
ma se li metto in un record Postgres consumeranno ~ 50. E` un po` come
l'Integer in Java consuma piu` dei 4 byte del int.
Chiaro che HSQLDB, essendo in-memory, ha altri punti d'ecellenza -
il buon vecchio "use the right tool for the right job e sempre valido,
insomma.
Come tu hai gia` capito ci sono dei pipeline non-standard per inserire
tanti dati (appunti COPY di postgres), e se guardi il link che ho
mandato a "ETL" su Wikipedia scoprirai che il loading dei data e`
un po` una scienza a parte.
Bye,
Chris.