From: drh <> Date: Wed, 15 Apr 2026 10:49:14 +0000 (+0000) Subject: Compute the average fanout for b-trees of depth 2 or more. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9efde40a5d5911826ff981c6f61f559a1064f989;p=thirdparty%2Fsqlite.git Compute the average fanout for b-trees of depth 2 or more. FossilOrigin-Name: 2f8598bb09f32100f22dd1d9465f3fa0f7f8d81f5d67c34de9919708345f090b --- diff --git a/ext/misc/analyze.c b/ext/misc/analyze.c index a6aaf85f9f..c017fb898e 100644 --- a/ext/misc/analyze.c +++ b/ext/misc/analyze.c @@ -293,6 +293,7 @@ static int analysisSubreport( sqlite3_int64 leaf_unused; /* unused bytes on leaf pages */ sqlite3_int64 int_unused; /* unused bytes on internal pages */ sqlite3_int64 ovfl_unused; /* unused bytes on overflow pages */ + sqlite3_int64 int_cell; /* B-tree entries on internal pages */ sqlite3_int64 depth; /* btree depth */ sqlite3_int64 cnt; /* Number of s.zSU entries that match */ sqlite3_int64 storage; /* Total bytes */ @@ -319,7 +320,8 @@ static int analysisSubreport( " sum(int_unused),\n" /* 9 */ " sum(ovfl_unused),\n" /* 10 */ " max(depth),\n" /* 11 */ - " count(*)\n" /* 12 */ + " count(*),\n" /* 12 */ + " sum(int_entries)\n" /* 13 */ " FROM temp.%s WHERE %s", p->zSU, zWhere); if( pStmt==0 ) return 1; @@ -340,6 +342,7 @@ static int analysisSubreport( ovfl_unused = sqlite3_column_int64(pStmt, 10); depth = sqlite3_column_int64(pStmt, 11); cnt = sqlite3_column_int64(pStmt, 12); + int_cell = sqlite3_column_int64(pStmt, 13); rc = SQLITE_DONE; total_pages = leaf_pages + int_pages + ovfl_pages; @@ -360,6 +363,10 @@ static int analysisSubreport( analysisPercent(p, total_meta*100.0/(double)storage); if( cnt==1 ){ analysisLine(p, "B-tree depth", "%lld\n", depth); + if( int_cell>1 ){ + analysisLine(p, "Average fanout", "%.1f\n", + (double)(int_cell+1)/(double)int_pages); + } } if( nentry>0 ){ analysisLine(p, "Average payload per entry", "%.1f\n", @@ -464,7 +471,8 @@ static void analyzeFunc( " ovfl_pages int, -- Overflow pages used\n" " int_unused int, -- Unused bytes on interior pages\n" " leaf_unused int, -- Unused bytes on primary pages\n" - " ovfl_unused int -- Unused bytes on overflow pages\n" + " ovfl_unused int, -- Unused bytes on overflow pages\n" + " int_entries int -- Btree cells on internal pages\n" ");", s.zSU ); @@ -510,7 +518,8 @@ static void analyzeFunc( " sum(pagetype='overflow'),\n" " sum((pagetype='internal')*unused),\n" " sum((pagetype='leaf')*unused),\n" - " sum((pagetype='overflow')*unused)\n" + " sum((pagetype='overflow')*unused),\n" + " sum(if(pagetype='internal',ncell))\n" " FROM allobj CROSS JOIN dbstat(%Q) \n" " WHERE dbstat.name=allobj.allname\n" " GROUP BY allname;\n", @@ -738,7 +747,8 @@ static void analyzeFunc( " ovfl_pages int, -- Overflow pages used\n" /* 13 */ " int_unused int, -- Unused bytes on interior pages\n" /* 14 */ " leaf_unused int, -- Unused bytes on primary pages\n" /* 15 */ - " ovfl_unused int -- Unused bytes on overflow pages\n" /* 16 */ + " ovfl_unused int, -- Unused bytes on overflow pages\n" /* 16 */ + " int_entries int -- B-tree entries on internal pages\n"/* 17 */ ");\n" "INSERT INTO space_used VALUES\n" ); @@ -747,7 +757,7 @@ static void analyzeFunc( " is_index, is_without_rowid, nentry, leaf_entries,\n" /* 2..5 */ " depth, payload, ovfl_payload, ovfl_cnt, mx_payload,\n" /* 6..10 */ " int_pages, leaf_pages, ovfl_pages, int_unused,\n" /* 11..14 */ - " leaf_unused, ovfl_unused\n" /* 15..16 */ + " leaf_unused, ovfl_unused, int_entries\n" /* 15..17 */ " FROM temp.%s;", s.zSU); if( pStmt==0 ) return; @@ -756,7 +766,7 @@ static void analyzeFunc( if( n++ ) sqlite3_str_appendf(s.pOut,",\n"); sqlite3_str_appendf(s.pOut, " (%s,%s,%lld,%lld,%lld,%lld,%lld,%lld,%lld," - "%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld)", + "%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld)", sqlite3_column_text(pStmt, 0), sqlite3_column_text(pStmt, 1), sqlite3_column_int64(pStmt, 2), @@ -773,7 +783,8 @@ static void analyzeFunc( sqlite3_column_int64(pStmt, 13), sqlite3_column_int64(pStmt, 14), sqlite3_column_int64(pStmt, 15), - sqlite3_column_int64(pStmt, 16)); + sqlite3_column_int64(pStmt, 16), + sqlite3_column_int64(pStmt, 17)); } if( rc!=SQLITE_DONE ){ analysisError(&s, "SQL run-time error: %s\nSQL: %s", diff --git a/manifest b/manifest index 868cb78717..9f332a5c74 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Code\ssimplifications.\s\sReturn\sNULL\sis\sthe\sspecified\sSCHEMA\sdoes\snot\sexist. -D 2026-04-14T23:19:02.848 +C Compute\sthe\saverage\sfanout\sfor\sb-trees\sof\sdepth\s2\sor\smore. +D 2026-04-15T10:49:14.796 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -358,7 +358,7 @@ F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b6 F ext/jni/src/tests/900-001-fts.test bf0ce17a8d082773450e91f2388f5bbb2dfa316d0b676c313c637a91198090f0 F ext/misc/README.md 6243cdc4d7eb791c41ef0716f3980b8b5f6aa8c61ff76a3958cbf0031c6ebfa7 F ext/misc/amatch.c 8d237cc014b3736922c26a76a451050d244aa4980c47c531f368f817b1e77b49 -F ext/misc/analyze.c 43e774e832e3e67ff3871a169272f03722a18671d4363bfd2f72d32cfce53820 +F ext/misc/analyze.c b4796025ba05b31d55150b735aaffcf1f1138ed112243b3d18884a31d049a7d1 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 9642c7a194a2a25dca7ad3e36af24a0a46d7702168c4ad7e59c9f9b0e16a3824 F ext/misc/base64.c 1445761667c16356e827fc6418294c869468be934429aaa8315035e76dd58acf @@ -2199,8 +2199,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P bb4a9beac87796b4186efce416bf03f840041bc588be6702c5a444d643df684e -R e7f6835daaccdf5e7b6289dc60f181f3 +P 953969c88149ea2f589942b98a0a96d907956319e5aa09e2d5a3ae76d3e7d70a +R 5d654c3affeea1d5147e00173ff491e0 U drh -Z c5df2a2668c00250df8de94d1161fa38 +Z a1e7f4cc02c6ed8230a8c2c2df43d5f3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 472672eda1..990a560966 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -953969c88149ea2f589942b98a0a96d907956319e5aa09e2d5a3ae76d3e7d70a +2f8598bb09f32100f22dd1d9465f3fa0f7f8d81f5d67c34de9919708345f090b