Newsgroup: it.comp.software.database
Titolo: hsql e tabelle con 300000 record

ciao a tutti volevo realizzare una applicazione java e sfruttare hsql che ho già usato varie volte per tabelle "piccole".
ora devo utilizzare una tabella grande con 300k record circa e fare un'applicazione stand-alone che deve girare su win.
prima di procedere ho fatto un test di velocità ma mi sono bloccato.
se eseguo queste query:
--istantanea
CREATE TEXT TABLE binding_txt (
    id_persona char(20),
    nome varchar(255),
    cognome varchar(255),
    via  varchar(255),
    num_civico  varchar(255),
    cap  char(5),
    citta  varchar(255),
    provincia  char(2),
    codice  varchar(255)
);
\p Setting text file source
--ci mette alcuni minuti(5/10), il file contiene 300000 righe circa
SET TABLE binding_txt SOURCE "dicembre.txt;ignore_first=true;quoted=false;fs=\semi";
--ci mettono mooooolti minuti in più (10/20/-->infinito)
create index nomecogn on binding_txt(nome, cognome);
alter table binding_txt add PRIMARY KEY(id_persona);
inoltre se creo una tabella cached e ci inserisco le stesse linee, il db
viene creato, gli indici ci mettono comunque vari minuti, ma la cosa
drammatica è che l'apertura del db "pieno" è lentissima (10/20 minuti).
ora, il mio hardware non è aggiornato, (pIII 512 Mb ram / linux + xfce4)
ma non ho mai avuto problemi a sviluppare. ho visto che tra le faq si
segnala ( 
http://hsqldb.org/web/hsqlFAQ.html#BIGRESULTS
 )
di non creare recordset grandi, ma qui il problema è proprio ad aprire il db.
sbaglio qualcosa o mi devo rassegnare a sviluppare in access + vb? qualcuno conosce un db
standalone x java che gestisca la situazione? 
grazie. 
max

 standalone x java che gestisca la situazione? 
Non conosco hsql, e quella che segue magari è solo una sparata, ma usare 
Java con sqlite? O non ho proprio capito il problema? :-P
Ciao!
--ev

 ha scritto:

ma si integra con java bene (cioè ci sono i connettori jdbc?)
e poi, non vorrei che a metà mi trovo nella stessa situazione, cioè che non gestisca tabelle di quelle dimensioni.
tu ne hai esperienza?

 tu ne hai esperienza?
tabella con 4 colonne, ed un po' di dati inseriti (i commenti sono fra 
parentesi quadre):
sql > sqlite test.sqlite
SQLite version 2.8.16
Enter ".help" for instructions
sqlite>  .read test.sql
[importazione dei record ... lenta, per carità, molto lenta! Anche 
perchè ho il fsync() attivato]
sqlite> select count(1) from tabella;
320994
[risposta pressochè istantanea. Purtroppo non viene visualizzato il 
tempo di esecuzione delle query]
sqlite> create index test on tabella(campo1, campo2);
[un paio di secondi]
sqlite> select count(1) from tabella where campo1 like'%A%';
189474
[query scema, ma in un secondo ho il risultato]
Ecco, giusto 2 dati al volo da prendere con le dovute pinze! Come vedi 
sono entrato direttamente nel DB senza passare per altri linguaggi, ma 
anche utilizzando le API per il linguaggio TalDeiTali i risultati 
dovrebbero essere i medesimi!
Nota solo una cosa: se non l'hai mai usato all'inizio ti sembrerà "uno 
strano brandello di SQL", ma per applicazioni standalone senza 
architettura client-server io l'ho sempre visto come "la soluzione 
ottimale"! Ci lavoro in PHP ed in PERL, ma suppongo che i wrappers per 
gli altri linguaggi siano altrettanto funzionanti.
Ciao!
--ev

ieri ho provato velocemente a installare sqlite e a compilare il
wrapper java, questo:
http://www.ch-werner.de/javasqlite/overview-summary.html
installato, importato da linea di comando la mia tabella in pochi
secondi, e in java va che è una meraviglia, apre il db velocemente,
query veloci, usa bene indici e chiavi.
siccome è scritto in c e non è nativo java per le applicazioni da
esportare serve allegare la libreria, pesa pochi kb.
Insomma, grazie del consiglio perchè le performance mi sembrano
ottime.
per l'sql, mi tapperò il naso. (non che manchino features fondamentali
in un db standalone, mi pare! 
http://www.sqlite.org/omitted.html
 )
ciao e grazie
ps: ma che vuol dire
select count(1) ....
intendevi forse 
select count(*) ...
max

 query veloci, usa bene indici e chiavi.
Se il wrapper e` quello per SQLite 2.x, tieni presente che l'unico datatype
supportato e` il varchar. Comunque, prova anche a vedere il database
distribuito sul sito di Apache (e` la nuova versione di Cloudscape, un
database in Java che IBM ha acquistato e rilasciato come open source)
Henryx

 select count(*) ...
No, con select count(1) dici all'engine di NON andare a prelevare i dati 
  dalle tabelle come farebbe con un select count(*). Se ti interessa 
solo sapere _quante_ sono le righe in una tabella, count(1) è 
leggermente più "scaltro"!
Non sono un esperto e non pretendo di esserlo, e probabilmente qualcuno 
qui dentro ti saprà illustrare meglio la cosa!
Ciao!
--ev