Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Make the BTree balance() routine a little faster by reusing database pages locally rather than freeing and reallocating them. (CVS 666) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
3c2dea4310af491d6cb09856d4bc5236 |
User & Date: | drh 2002-07-08 02:16:38.000 |
Context
2002-07-08
| ||
10:59 | In the BTree subsystem, when using pages from the freelist, attempt to select pages close to related pages in order to keep data structures near each other in the database file. This improves access speed in some circumstances. (CVS 667) (check-in: fd7e41f0ee user: drh tags: trunk) | |
02:16 | Make the BTree balance() routine a little faster by reusing database pages locally rather than freeing and reallocating them. (CVS 666) (check-in: 3c2dea4310 user: drh tags: trunk) | |
2002-07-07
| ||
17:13 | Version 2.5.6 (CVS 664) (check-in: 111c78e683 user: drh tags: trunk) | |
Changes
Changes to src/btree.c.
1 2 3 4 5 6 7 8 9 10 11 | /* ** 2001 September 15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* ** 2001 September 15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** $Id: btree.c,v 1.66 2002/07/08 02:16:38 drh Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** For a detailed discussion of BTrees, refer to ** ** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: ** "Sorting And Searching", pages 473-480. Addison-Wesley ** Publishing Company, Reading, Massachusetts. |
︙ | ︙ | |||
2095 2096 2097 2098 2099 2100 2101 | ** Make copies of the content of pPage and its siblings into aOld[]. ** The rest of this function will use data from the copies rather ** that the original pages since the original pages will be in the ** process of being overwritten. */ for(i=0; i<nOld; i++){ copyPage(&aOld[i], apOld[i]); | < < < < | | 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 | ** Make copies of the content of pPage and its siblings into aOld[]. ** The rest of this function will use data from the copies rather ** that the original pages since the original pages will be in the ** process of being overwritten. */ for(i=0; i<nOld; i++){ copyPage(&aOld[i], apOld[i]); } /* ** Load pointers to all cells on sibling pages and the divider cells ** into the local apCell[] array. Make copies of the divider cells ** into aTemp[] and remove the the divider Cells from pParent. */ nCell = 0; for(i=0; i<nOld; i++){ MemPage *pOld = &aOld[i]; for(j=0; j<pOld->nCell; j++){ apCell[nCell] = pOld->apCell[j]; szCell[nCell] = cellSize(apCell[nCell]); nCell++; } if( i<nOld-1 ){ szCell[nCell] = cellSize(apDiv[i]); |
︙ | ︙ | |||
2162 2163 2164 2165 2166 2167 2168 | szNew[i] += szCell[cntNew[i-1]]; szNew[i-1] -= szCell[cntNew[i-1]-1]; } } assert( cntNew[0]>0 ); /* | | > > > > > > | | > > > > > > > > > > > | 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 | szNew[i] += szCell[cntNew[i-1]]; szNew[i-1] -= szCell[cntNew[i-1]-1]; } } assert( cntNew[0]>0 ); /* ** Allocate k new pages. Reuse old pages where possible. */ for(i=0; i<k; i++){ if( i<nOld ){ apNew[i] = apOld[i]; pgnoNew[i] = pgnoOld[i]; apOld[i] = 0; sqlitepager_write(apNew[i]); }else{ rc = allocatePage(pBt, &apNew[i], &pgnoNew[i]); if( rc ) goto balance_cleanup; } nNew++; zeroPage(apNew[i]); apNew[i]->isInit = 1; } /* Free any old pages that were not reused as new pages. */ while( i<nOld ){ rc = freePage(pBt, apOld[i], pgnoOld[i]); if( rc ) goto balance_cleanup; sqlitepager_unref(apOld[i]); apOld[i] = 0; i++; } /* ** Put the new pages in accending order. This helps to ** keep entries in the disk file in order so that a scan ** of the table is a linear scan through the file. That ** in turn helps the operating system to deliver pages ** from the disk more rapidly. |
︙ | ︙ | |||
2232 2233 2234 2235 2236 2237 2238 | if( pCur && iCur==j ){ pCur->pPage = pParent; pCur->idx = nxDiv; } insertCell(pParent, nxDiv, apCell[j], szCell[j]); j++; nxDiv++; } } assert( j==nCell ); | | | 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 | if( pCur && iCur==j ){ pCur->pPage = pParent; pCur->idx = nxDiv; } insertCell(pParent, nxDiv, apCell[j], szCell[j]); j++; nxDiv++; } } assert( j==nCell ); apNew[nNew-1]->u.hdr.rightChild = aOld[nOld-1].u.hdr.rightChild; if( nxDiv==pParent->nCell ){ pParent->u.hdr.rightChild = pgnoNew[nNew-1]; }else{ pParent->apCell[nxDiv]->h.leftChild = pgnoNew[nNew-1]; } if( pCur ){ if( j<=iCur && pCur->pPage==pParent && pCur->idx>idxDiv[nOld-1] ){ |
︙ | ︙ | |||
2270 2271 2272 2273 2274 2275 2276 | ** Cleanup before returning. */ balance_cleanup: if( extraUnref ){ sqlitepager_unref(extraUnref); } for(i=0; i<nOld; i++){ | | | 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 | ** Cleanup before returning. */ balance_cleanup: if( extraUnref ){ sqlitepager_unref(extraUnref); } for(i=0; i<nOld; i++){ if( apOld[i]!=0 && apOld[i]!=&aOld[i] ) sqlitepager_unref(apOld[i]); } for(i=0; i<nNew; i++){ sqlitepager_unref(apNew[i]); } if( pCur && pCur->pPage==0 ){ pCur->pPage = pParent; pCur->idx = 0; |
︙ | ︙ |