mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Change the pcache module to keep track of the total number of references to
all pages rather than the number of pages references, for a performance improvement and size reduction. FossilOrigin-Name: f00a9e1e998c4bd249a45444dc2d71a7e4903b8b
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C A\ssimple\soptimization\sand\ssize\sreduction\sin\ssqlite3PagerAcquire().
|
C Change\sthe\spcache\smodule\sto\skeep\strack\sof\sthe\stotal\snumber\sof\sreferences\sto\nall\spages\srather\sthan\sthe\snumber\sof\spages\sreferences,\sfor\sa\sperformance\nimprovement\sand\ssize\sreduction.
|
||||||
D 2015-09-03T18:20:10.962
|
D 2015-09-03T20:43:55.204
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239
|
F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -324,12 +324,12 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
|||||||
F src/os_unix.c 76f493ed71c4154338049dee1bf6e47f69c74a55
|
F src/os_unix.c 76f493ed71c4154338049dee1bf6e47f69c74a55
|
||||||
F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a
|
F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a
|
||||||
F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
|
F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
|
||||||
F src/pager.c 748ff3e183e0a311328af902c0819c6a8e3f22ca
|
F src/pager.c 4784012f80b2197c61ff6eaf4f5c7026d93253fd
|
||||||
F src/pager.h 6d435f563b3f7fcae4b84433b76a6ac2730036e2
|
F src/pager.h 6d435f563b3f7fcae4b84433b76a6ac2730036e2
|
||||||
F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7
|
F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7
|
||||||
F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0
|
F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef
|
||||||
F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9
|
F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9
|
||||||
F src/pcache1.c b31af9dbc83b9c68e87d681b8453a9605f28e734
|
F src/pcache1.c e1529369c047ac645e6a28196f25b7e936c46b82
|
||||||
F src/pragma.c d71b813e67bf03f3116b9dd5164fbfd81ec673a2
|
F src/pragma.c d71b813e67bf03f3116b9dd5164fbfd81ec673a2
|
||||||
F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a
|
F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a
|
||||||
F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
|
F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
|
||||||
@@ -1380,7 +1380,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P b79096be7cb02aae2f303db33a8bf19e69204374
|
P 618d8dd4ff44cce10cc4688a2134715ff66cc562
|
||||||
R d1173d7149bc899e819d5c3a3bb552ec
|
R 7304361de7c7fa82f683343fecc699dd
|
||||||
U drh
|
U drh
|
||||||
Z 442809bedf9761a63ee7744b080363fa
|
Z 8da3824804c6c5593515c7564fca1c5b
|
||||||
|
@@ -1 +1 @@
|
|||||||
618d8dd4ff44cce10cc4688a2134715ff66cc562
|
f00a9e1e998c4bd249a45444dc2d71a7e4903b8b
|
@@ -5261,6 +5261,10 @@ int sqlite3PagerAcquire(
|
|||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* Optimization note: Adding the "pgno<=1" term before "pgno==0" here
|
||||||
|
** allows the compiler optimizer to reuse the results of the "pgno>1"
|
||||||
|
** test in the previous statement, and avoid testing pgno==0 in the
|
||||||
|
** common case where pgno is large. */
|
||||||
if( pgno<=1 && pgno==0 ){
|
if( pgno<=1 && pgno==0 ){
|
||||||
return SQLITE_CORRUPT_BKPT;
|
return SQLITE_CORRUPT_BKPT;
|
||||||
}
|
}
|
||||||
@@ -6390,7 +6394,7 @@ u8 sqlite3PagerIsreadonly(Pager *pPager){
|
|||||||
|
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
/*
|
/*
|
||||||
** Return the number of references to the pager.
|
** Return the sum of the reference counts for all pages held by pPager.
|
||||||
*/
|
*/
|
||||||
int sqlite3PagerRefcount(Pager *pPager){
|
int sqlite3PagerRefcount(Pager *pPager){
|
||||||
return sqlite3PcacheRefCount(pPager->pPCache);
|
return sqlite3PcacheRefCount(pPager->pPCache);
|
||||||
|
27
src/pcache.c
27
src/pcache.c
@@ -19,7 +19,7 @@
|
|||||||
struct PCache {
|
struct PCache {
|
||||||
PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */
|
PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */
|
||||||
PgHdr *pSynced; /* Last synced page in dirty page list */
|
PgHdr *pSynced; /* Last synced page in dirty page list */
|
||||||
int nRef; /* Number of referenced pages */
|
int nRefSum; /* Sum of ref counts over all pages */
|
||||||
int szCache; /* Configured cache size */
|
int szCache; /* Configured cache size */
|
||||||
int szPage; /* Size of every page in this cache */
|
int szPage; /* Size of every page in this cache */
|
||||||
int szExtra; /* Size of extra space for each page */
|
int szExtra; /* Size of extra space for each page */
|
||||||
@@ -184,7 +184,7 @@ int sqlite3PcacheOpen(
|
|||||||
** are no outstanding page references when this function is called.
|
** are no outstanding page references when this function is called.
|
||||||
*/
|
*/
|
||||||
int sqlite3PcacheSetPageSize(PCache *pCache, int szPage){
|
int sqlite3PcacheSetPageSize(PCache *pCache, int szPage){
|
||||||
assert( pCache->nRef==0 && pCache->pDirty==0 );
|
assert( pCache->nRefSum==0 && pCache->pDirty==0 );
|
||||||
if( pCache->szPage ){
|
if( pCache->szPage ){
|
||||||
sqlite3_pcache *pNew;
|
sqlite3_pcache *pNew;
|
||||||
pNew = sqlite3GlobalConfig.pcache2.xCreate(
|
pNew = sqlite3GlobalConfig.pcache2.xCreate(
|
||||||
@@ -351,9 +351,7 @@ PgHdr *sqlite3PcacheFetchFinish(
|
|||||||
if( !pPgHdr->pPage ){
|
if( !pPgHdr->pPage ){
|
||||||
return pcacheFetchFinishWithInit(pCache, pgno, pPage);
|
return pcacheFetchFinishWithInit(pCache, pgno, pPage);
|
||||||
}
|
}
|
||||||
if( 0==pPgHdr->nRef ){
|
pCache->nRefSum++;
|
||||||
pCache->nRef++;
|
|
||||||
}
|
|
||||||
pPgHdr->nRef++;
|
pPgHdr->nRef++;
|
||||||
return pPgHdr;
|
return pPgHdr;
|
||||||
}
|
}
|
||||||
@@ -364,9 +362,8 @@ PgHdr *sqlite3PcacheFetchFinish(
|
|||||||
*/
|
*/
|
||||||
void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){
|
void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){
|
||||||
assert( p->nRef>0 );
|
assert( p->nRef>0 );
|
||||||
p->nRef--;
|
p->pCache->nRefSum--;
|
||||||
if( p->nRef==0 ){
|
if( (--p->nRef)==0 ){
|
||||||
p->pCache->nRef--;
|
|
||||||
if( p->flags&PGHDR_CLEAN ){
|
if( p->flags&PGHDR_CLEAN ){
|
||||||
pcacheUnpin(p);
|
pcacheUnpin(p);
|
||||||
}else if( p->pDirtyPrev!=0 ){
|
}else if( p->pDirtyPrev!=0 ){
|
||||||
@@ -382,6 +379,7 @@ void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){
|
|||||||
void sqlite3PcacheRef(PgHdr *p){
|
void sqlite3PcacheRef(PgHdr *p){
|
||||||
assert(p->nRef>0);
|
assert(p->nRef>0);
|
||||||
p->nRef++;
|
p->nRef++;
|
||||||
|
p->pCache->nRefSum++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -394,7 +392,7 @@ void sqlite3PcacheDrop(PgHdr *p){
|
|||||||
if( p->flags&PGHDR_DIRTY ){
|
if( p->flags&PGHDR_DIRTY ){
|
||||||
pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE);
|
pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE);
|
||||||
}
|
}
|
||||||
p->pCache->nRef--;
|
p->pCache->nRefSum--;
|
||||||
sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 1);
|
sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,11 +488,11 @@ void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){
|
|||||||
sqlite3PcacheMakeClean(p);
|
sqlite3PcacheMakeClean(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pgno==0 && pCache->nRef ){
|
if( pgno==0 && pCache->nRefSum ){
|
||||||
sqlite3_pcache_page *pPage1;
|
sqlite3_pcache_page *pPage1;
|
||||||
pPage1 = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache,1,0);
|
pPage1 = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache,1,0);
|
||||||
if( ALWAYS(pPage1) ){ /* Page 1 is always available in cache, because
|
if( ALWAYS(pPage1) ){ /* Page 1 is always available in cache, because
|
||||||
** pCache->nRef>0 */
|
** pCache->nRefSum>0 */
|
||||||
memset(pPage1->pBuf, 0, pCache->szPage);
|
memset(pPage1->pBuf, 0, pCache->szPage);
|
||||||
pgno = 1;
|
pgno = 1;
|
||||||
}
|
}
|
||||||
@@ -600,10 +598,13 @@ PgHdr *sqlite3PcacheDirtyList(PCache *pCache){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Return the total number of referenced pages held by the cache.
|
** Return the total number of references to all pages held by the cache.
|
||||||
|
**
|
||||||
|
** This is not the total number of pages referenced, but the sum of the
|
||||||
|
** reference count for all pages.
|
||||||
*/
|
*/
|
||||||
int sqlite3PcacheRefCount(PCache *pCache){
|
int sqlite3PcacheRefCount(PCache *pCache){
|
||||||
return pCache->nRef;
|
return pCache->nRefSum;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -961,7 +961,10 @@ static PgHdr1 *pcache1FetchNoMutex(
|
|||||||
pPage = pCache->apHash[iKey % pCache->nHash];
|
pPage = pCache->apHash[iKey % pCache->nHash];
|
||||||
while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; }
|
while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; }
|
||||||
|
|
||||||
/* Step 2: Abort if no existing page is found and createFlag is 0 */
|
/* Step 2: If the page was found in the hash table, then return it.
|
||||||
|
** If the page was not in the hash table and createFlag is 0, abort.
|
||||||
|
** Otherwise (page not in hash and createFlag!=0) continue with
|
||||||
|
** subsequent steps to try to create the page. */
|
||||||
if( pPage ){
|
if( pPage ){
|
||||||
if( !pPage->isPinned ){
|
if( !pPage->isPinned ){
|
||||||
return pcache1PinPage(pPage);
|
return pcache1PinPage(pPage);
|
||||||
|
Reference in New Issue
Block a user