Re: [sqlite] EXT :Re: UPDATE/INSERTing 1-2k rows slower than expected
I ran some tests on my USB stick and pulled-while-writing...no corruption at all. Integrity check worked fine every time. I checked and write caching is not enabled for that drive (Windows XP 64) For Linux I believe you can force synchronous mode with a mount like this: /dev/sdb1 /media/usb vfat user,sync,dirsync 0 0 Now if the drive still doesn't obey that...then we have a problem like you mention with pull-happy users. Copy old db to new...muck with new...copy to 3rd, rename first, rename 3rd to 1st. Or something like that. So you always have one good version laying around. Michael D. Black Senior Scientist NG Information Systems Advanced Analytics Directorate From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org] on behalf of Max Vlasov [max.vla...@gmail.com] Sent: Monday, February 14, 2011 3:06 PM To: General Discussion of SQLite Database Subject: EXT :Re: [sqlite] UPDATE/INSERTing 1-2k rows slower than expected On Mon, Feb 14, 2011 at 11:50 PM, Black, Michael (IS) < michael.bla...@ngc.com> wrote: > And if you want to talk about data reliability...BACK UP YOUR DATA. > The likely failure points I can think of are: > #1 Power supply (redundant supplies available) > #2 Hard drive smoked (and your data is toast anyways -- RAID can help). > #3 Blue screen (or kernel lockup on Unix) > #4 CPU smoked. (usually leads to #3) > #5 RAM smoked. (usually leads to #3) > #6 Motherboard smoked (usually just dies or #3) > > The only way to increase your reliability is to replicate and/or backup. > All the whining about acid-tested drives is a waste of time. #3 through #6 > have no solution though they shouldn't cause the hard drive corruption > you're worried about. And since #1 and #2 have solutions what's the > problem? > > I see some problem especially for sqlite since in contrary to server-side databases, it's more consumer-oriented. Firefox, Apple Mail to name a few. And if we remember that it's very portable we see other possibilities. For example, there's already Portable Firefox that is usually used from usb sticks. What's going to happen to user history of such browser if the user forget to safely unmount the flash drive in the middle of the page reloading? What about music-management software that is portable enough to be used right from the external hard-drive? You don't usually use PostgreSQL or MySql for such applications. Max ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] EXT :Re: UPDATE/INSERTing 1-2k rows slower than expected
> We already determined that triggers kill you on inserts so you can't use > triggers (other than as another example of what NOT to do for speed). that's why I added that in your test code... :-) Surprisingly I'm not able to reproduce a dramatic slowdown using my simple trigger test. It does slow down to use a trigger compared to a manual update but not more than natural, but I'm not sure if my trigger test is a working use-case. Wal mode speeds up noticable. That is exiting. Marcus > > Michael D. Black > Senior Scientist > NG Information Systems > Advanced Analytics Directorate > > > > > From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org] on > behalf of Marcus Grimm [mgr...@medcom-online.de] > Sent: Saturday, February 12, 2011 10:23 AM > To: General Discussion of SQLite Database > Subject: EXT :Re: [sqlite] UPDATE/INSERTing 1-2k rows slower than expected > >> On Sat, Feb 12, 2011 at 9:10 AM, Black, Michael (IS) >>>> D:\SQLite>batch 5000 1 >>> 360766.6 inserts per sec >>> >> >> Unless I'm missing something, SQLite has to update the first page of the >> database on every commit, to update the change counter. Assuming you >> are >> using rotating media, that record can only be updated 120 times per >> second, >> maximum, on a 7200RPM drive. >> >> I don't understand how you can do 360K commits per second if your system >> is >> actually doing "to the platter" writes on every commit. Can someone >> clue >> me >> in? > > I think the time measuring is not correct as sqlite can't in fact > do a commit with more than appx. 10-20 commits/sec. > > here is a slightly modified version, ignore the trigger stuff: > -- > #include > #include > #include > #include > #include > #include "sqlite3.h" > #include > #include > > int AddTrigger(sqlite3 *db) > { > char SqlTxt[256]; > int rc; > > strcpy(SqlTxt,"CREATE TRIGGER XX AFTER INSERT ON t FOR EACH ROW > BEGIN "); > strcat(SqlTxt,"UPDATE t2 SET n = NEW.i;"); > strcat(SqlTxt,"END;"); > rc = sqlite3_exec(db,SqlTxt,NULL,NULL,NULL); > if (rc != SQLITE_OK) { > puts(sqlite3_errmsg(db)); > } > return(0); > } > > int main(int argc, char *argv[]) > { > sqlite3 *db; > sqlite3_stmt *stmt=NULL; > int rc; > int n=0; > int nrec=0; > int interval=0; > intAddTr = 0; > double t1; > char SqlTxt[256]; > > if (argc < 3) { > fprintf(stderr,"Usage: %s nrecords commit_interval\n",argv[0]); > exit(-1); > } > nrec=atoi(argv[1]); > interval=atoi(argv[2]); > if( argc == 4 ) > AddTr = atoi(argv[3]); > remove("C:\\batch.db"); > rc=sqlite3_open("C:\\batch.db",); > if (rc != SQLITE_OK) { > puts(sqlite3_errmsg(db)); > } > sqlite3_exec(db,"create table t (i integer)",NULL,NULL,NULL); > sqlite3_exec(db,"create table t2 (n integer)",NULL,NULL,NULL); > sqlite3_exec(db,"insert into t2 values(7);",NULL,NULL,NULL); > if(AddTr) > AddTrigger(db); > > // turn on WAL mode if you want to test it > //sqlite3_exec(db,"pragma journal_mode=WAL",NULL,NULL,NULL); > //sqlite3_prepare_v2(db,"insert into t values(?)",-1,,NULL); > t1=clock(); > if (interval != 1) rc=sqlite3_exec(db,"begin",NULL,NULL,NULL); > while(n < nrec) > { > ++n; > if (interval != 1 && (n% interval)==0) { >sqlite3_exec(db,"commit",NULL,NULL,NULL); >sqlite3_exec(db,"begin",NULL,NULL,NULL); > } > sprintf(SqlTxt, "insert into t values(%d);", n); > sqlite3_exec(db,SqlTxt,NULL,NULL,NULL); > } > sqlite3_exec(db,"commit",NULL,NULL,NULL); > printf("%.1f inserts per sec\n",nrec/((clock()-t1)/CLOCKS_PER_SEC)); > sqlite3_close(db); > } > -- > > Marcus > >> >> Jim >> -- >> HashBackup: easy onsite and offsite Unix backup >> http://www.hashbackup.com >> ___ >> sqlite-users mailing list >> sqlite-users@sqlite.org >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >> > > > ___ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] EXT :Re: UPDATE/INSERTing 1-2k rows slower than expected
We already determined that triggers kill you on inserts so you can't use triggers (other than as another example of what NOT to do for speed). Michael D. Black Senior Scientist NG Information Systems Advanced Analytics Directorate From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org] on behalf of Marcus Grimm [mgr...@medcom-online.de] Sent: Saturday, February 12, 2011 10:23 AM To: General Discussion of SQLite Database Subject: EXT :Re: [sqlite] UPDATE/INSERTing 1-2k rows slower than expected > On Sat, Feb 12, 2011 at 9:10 AM, Black, Michael (IS) >> D:\SQLite>batch 5000 1 >> 360766.6 inserts per sec >> > > Unless I'm missing something, SQLite has to update the first page of the > database on every commit, to update the change counter. Assuming you are > using rotating media, that record can only be updated 120 times per > second, > maximum, on a 7200RPM drive. > > I don't understand how you can do 360K commits per second if your system > is > actually doing "to the platter" writes on every commit. Can someone clue > me > in? I think the time measuring is not correct as sqlite can't in fact do a commit with more than appx. 10-20 commits/sec. here is a slightly modified version, ignore the trigger stuff: -- #include #include #include #include #include #include "sqlite3.h" #include #include int AddTrigger(sqlite3 *db) { char SqlTxt[256]; int rc; strcpy(SqlTxt,"CREATE TRIGGER XX AFTER INSERT ON t FOR EACH ROW BEGIN "); strcat(SqlTxt,"UPDATE t2 SET n = NEW.i;"); strcat(SqlTxt,"END;"); rc = sqlite3_exec(db,SqlTxt,NULL,NULL,NULL); if (rc != SQLITE_OK) { puts(sqlite3_errmsg(db)); } return(0); } int main(int argc, char *argv[]) { sqlite3 *db; sqlite3_stmt *stmt=NULL; int rc; int n=0; int nrec=0; int interval=0; intAddTr = 0; double t1; char SqlTxt[256]; if (argc < 3) { fprintf(stderr,"Usage: %s nrecords commit_interval\n",argv[0]); exit(-1); } nrec=atoi(argv[1]); interval=atoi(argv[2]); if( argc == 4 ) AddTr = atoi(argv[3]); remove("C:\\batch.db"); rc=sqlite3_open("C:\\batch.db",); if (rc != SQLITE_OK) { puts(sqlite3_errmsg(db)); } sqlite3_exec(db,"create table t (i integer)",NULL,NULL,NULL); sqlite3_exec(db,"create table t2 (n integer)",NULL,NULL,NULL); sqlite3_exec(db,"insert into t2 values(7);",NULL,NULL,NULL); if(AddTr) AddTrigger(db); // turn on WAL mode if you want to test it //sqlite3_exec(db,"pragma journal_mode=WAL",NULL,NULL,NULL); //sqlite3_prepare_v2(db,"insert into t values(?)",-1,,NULL); t1=clock(); if (interval != 1) rc=sqlite3_exec(db,"begin",NULL,NULL,NULL); while(n < nrec) { ++n; if (interval != 1 && (n% interval)==0) { sqlite3_exec(db,"commit",NULL,NULL,NULL); sqlite3_exec(db,"begin",NULL,NULL,NULL); } sprintf(SqlTxt, "insert into t values(%d);", n); sqlite3_exec(db,SqlTxt,NULL,NULL,NULL); } sqlite3_exec(db,"commit",NULL,NULL,NULL); printf("%.1f inserts per sec\n",nrec/((clock()-t1)/CLOCKS_PER_SEC)); sqlite3_close(db); } -- Marcus > > Jim > -- > HashBackup: easy onsite and offsite Unix backup > http://www.hashbackup.com > ___ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users