PDA

Visualizza la versione completa : insert multiplo in SQlite


Raccoon29
09-09-2008, 10:21
Salve a tutti,

parto col dire che non so se è il posto giusto per fare una richiesta simile, ma mi rimetto alla clemenza dei moderatori :D

Ad ogni modo, vorrei sapere: su database SQlite è possibile in qualche modo (trucchi, scorciatoie, stratagemmi, idee, suggerimenti, tattiche) effettuare insert multipli con una sola query?
Un po' come quella cosa che MySql fa con


INSERT INTO table(col1,col2) VALUES(val1,val2),(val1,val2),(val1,val2)

che inserisce tre righe in tabella con una sola query.
Googlando in giro ho visto che questa è una particolare funzione fornita da MySql...

Ho bisogno di questa cosa, perché mi ritrovo a dover fare un'importazione anche di 10'000 righe, e 10'000 query INSERT (benché appoggiato da C++) comportano un ritardo mostruoso, roba da 5 minuti per 1'000 righe.

Perciò, è possibile in qualche modo emulare questa "feature" di MySql in SQlite?

Thanks in advance

denis76
09-09-2008, 16:40
Ecco la soluzione (in pascal):


Sqlite3DatasetLocale.Sql:= 'begin;';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
Sqlite3DatasetLocale.ExecSQL;
Sqlite3DatasetLocale.Sql:= 'commit;';
Sqlite3DatasetLocale.ExecSQL;

In questo modo il file archivio viene aperto e chiuso una sola volta e la cosa si conclude in brevi instanti.

Raccoon29
10-09-2008, 23:38
Oh grazie per la dritta!

In sostanza usare una transazione; sei sicuro che SQlite le supporti?
Comunque davvero grazie per la dritta, dovrò studiarmele ed applicarle con C++.

EDIT: ah sì,sì, supporta perfettamente, ed anche velocemente!
http://www.sqlite.org/speed.html
Grazie tante davvero, domani lo proverò, e già non sto nella pelle nel vedere i risultati (vorrò postare la differenza :D )

gratitude
ciauz

Raccoon29
11-09-2008, 10:01
:yuppi:
Grazie davvero per la dritta, va che è una meraviglia!

Come promesso posto la differenza:

20'000 righe
con insert separati: 46m 40s
con insert in commit: 43s

(il tutto in ambiente di debug)
Terrore! :D

Dio benedica le transazioni :biifu:

happiness
ciauz

Loading