]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Compute the average fanout for b-trees of depth 2 or more.
authordrh <>
Wed, 15 Apr 2026 10:49:14 +0000 (10:49 +0000)
committerdrh <>
Wed, 15 Apr 2026 10:49:14 +0000 (10:49 +0000)
FossilOrigin-Name: 2f8598bb09f32100f22dd1d9465f3fa0f7f8d81f5d67c34de9919708345f090b

ext/misc/analyze.c
manifest
manifest.uuid

index a6aaf85f9fca7b93ad362b67ab032a519aeb2d2e..c017fb898ecef1e3287f3edbf59bf9a6aee98de2 100644 (file)
@@ -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",
index 868cb78717cf3a90ee1277229c1f6ff349c40d7a..9f332a5c7476fdfb6febe5333feea33135491a33 100644 (file)
--- 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.
index 472672eda1235177e394ab4dc7843bd14694f6fd..990a560966cd421cad2304ede159084f30dc030b 100644 (file)
@@ -1 +1 @@
-953969c88149ea2f589942b98a0a96d907956319e5aa09e2d5a3ae76d3e7d70a
+2f8598bb09f32100f22dd1d9465f3fa0f7f8d81f5d67c34de9919708345f090b