]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Avoid calling truncate() and stat() on the checkpoint journal to improve the
authordrh <drh@noemail.net>
Tue, 7 Jan 2003 14:46:08 +0000 (14:46 +0000)
committerdrh <drh@noemail.net>
Tue, 7 Jan 2003 14:46:08 +0000 (14:46 +0000)
speed of a large number of UPDATEs within a transaction. (CVS 819)

FossilOrigin-Name: 2f89e9e6963cb715f3671f1fdbf4c966aadff6c8

manifest
manifest.uuid
src/pager.c

index 66305f9453fcd3c1073bf34b12f9110dbdd97cdc..739cf123ea16c8eb13c2930cbf213d01ebb7c539 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C In\sthe\sVDBE,\sallocate\sspace\sto\shold\scolumn\snames\swhen\sthe\sVDBE\sfirst\sstarts.\nThe\sColumnCount\sopcode\snow\sjust\swrites\sthe\snull\sterminator\sinto\sthis\sspace.\s(CVS\s818)
-D 2003-01-07T13:55:23
+C Avoid\scalling\struncate()\sand\sstat()\son\sthe\scheckpoint\sjournal\sto\simprove\sthe\nspeed\sof\sa\slarge\snumber\sof\sUPDATEs\swithin\sa\stransaction.\s(CVS\s819)
+D 2003-01-07T14:46:08
 F Makefile.in 868c17a1ae1c07603d491274cc8f86c04acf2a1e
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -32,7 +32,7 @@ F src/main.c cee05c2ba23b5e78f9671f319dbd68e2130e0f68
 F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
 F src/os.c 740022806209e44cab0abddfb1fee65c77702e21
 F src/os.h 09fd96b4d733aae2f3b98b2ae9ceea40b8fd780d
-F src/pager.c e7d05fa23a61f109c2276bb05be7a8d6721980f1
+F src/pager.c 20ea93000c5580f1ee4fa56dcc3d3589da35c70f
 F src/pager.h 540833e8cb826b80ce2e39aa917deee5e12db626
 F src/parse.y 427a17888c117cc9cc35311eda0603d55437f02b
 F src/printf.c 5c50fc1da75c8f5bf432b1ad17d91d6653acd167
@@ -152,7 +152,7 @@ F www/speed.tcl a20a792738475b68756ea7a19321600f23d1d803
 F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P 657c9fb5133aef93e4edd433912e6942ad9674ec
-R 30af34abe888623d0ad22c90d02b73df
+P 46d8f5e377bf790c18a7acdd1f3bc20b538d69eb
+R 137ba05a6f797353869b0a39dc185e2c
 U drh
-Z 10b12f5b3cbab70eee4329daa1b839b8
+Z e1ac466b5c8e5a1eafdd3945463b4e3b
index 78111bdaff30f242774c4f0e14dba86c469ae249..83e96ee63d05770c26e8df5855ad4a952d40a18a 100644 (file)
@@ -1 +1 @@
-46d8f5e377bf790c18a7acdd1f3bc20b538d69eb
\ No newline at end of file
+2f89e9e6963cb715f3671f1fdbf4c966aadff6c8
\ No newline at end of file
index 232d00b2faa375ff2672f59c8dda4793344c28bd..0a2e959cbc0198f41558dd39caaf237f6d2c0dfe 100644 (file)
@@ -18,7 +18,7 @@
 ** file simultaneously, or one process from reading the database while
 ** another is writing.
 **
-** @(#) $Id: pager.c,v 1.64 2003/01/03 02:04:27 drh Exp $
+** @(#) $Id: pager.c,v 1.65 2003/01/07 14:46:08 drh Exp $
 */
 #include "os.h"         /* Must be first to enable large file support */
 #include "sqliteInt.h"
@@ -109,6 +109,7 @@ struct Pager {
   int origDbSize;             /* dbSize before the current change */
   int ckptSize;               /* Size of database (in pages) at ckpt_begin() */
   off_t ckptJSize;            /* Size of journal at ckpt_begin() */
+  int ckptNRec;               /* Number of records in the checkpoint journal */
   int nExtra;                 /* Add this many bytes to each in-memory page */
   void (*xDestructor)(void*); /* Call this routine when freeing pages */
   int nPage;                  /* Total number of in-memory pages */
@@ -521,11 +522,7 @@ static int pager_ckpt_playback(Pager *pPager){
   */
   assert( pPager->ckptInUse && pPager->journalOpen );
   sqliteOsSeek(&pPager->cpfd, 0);
-  rc = sqliteOsFileSize(&pPager->cpfd, &nRec);
-  if( rc!=SQLITE_OK ){
-    goto end_ckpt_playback;
-  }
-  nRec /= sizeof(PageRecord);
+  nRec = pPager->ckptNRec;
   
   /* Copy original pages out of the checkpoint journal and back into the
   ** database file.
@@ -1374,6 +1371,7 @@ int sqlitepager_write(void *pData){
       pPager->errMask |= PAGER_ERR_FULL;
       return rc;
     }
+    pPager->ckptNRec++;
     assert( pPager->aInCkpt!=0 );
     pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
     page_add_to_ckpt_list(pPg);
@@ -1621,6 +1619,7 @@ int sqlitepager_ckpt_begin(Pager *pPager){
     rc = sqlitepager_opentemp(zTemp, &pPager->cpfd);
     if( rc ) goto ckpt_begin_failed;
     pPager->ckptOpen = 1;
+    pPager->ckptNRec = 0;
   }
   pPager->ckptInUse = 1;
   return SQLITE_OK;
@@ -1640,7 +1639,8 @@ int sqlitepager_ckpt_commit(Pager *pPager){
   if( pPager->ckptInUse ){
     PgHdr *pPg, *pNext;
     sqliteOsSeek(&pPager->cpfd, 0);
-    sqliteOsTruncate(&pPager->cpfd, 0);
+    /* sqliteOsTruncate(&pPager->cpfd, 0); */
+    pPager->ckptNRec = 0;
     pPager->ckptInUse = 0;
     sqliteFree( pPager->aInCkpt );
     pPager->aInCkpt = 0;