]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the "space_used.tcl" script to the tools directory. This script is used
authordrh <drh@noemail.net>
Sun, 24 Nov 2002 14:52:27 +0000 (14:52 +0000)
committerdrh <drh@noemail.net>
Sun, 24 Nov 2002 14:52:27 +0000 (14:52 +0000)
to measure how much disk space is used by each table and index of a database. (CVS 789)

FossilOrigin-Name: 83b2c27a568cd67cd5162d513766b23ff9fc2227

main.mk
manifest
manifest.uuid
src/test3.c
tool/space_used.tcl [new file with mode: 0644]

diff --git a/main.mk b/main.mk
index d7fe79255c5b1a943b338999dc1b78a848a2fd49..27593af659918f53ae3608b91122bf6c2352f8b6 100644 (file)
--- a/main.mk
+++ b/main.mk
@@ -212,7 +212,6 @@ config.h:
        rm -f temp.c temp
 
 sqlite.h:      $(TOP)/src/sqlite.h.in 
-       $(BCC) -o temp temp.c
        sed -e s/--VERS--/`cat ${TOP}/VERSION`/ \
             -e s/--ENCODING--/$(ENCODING)/ \
                  $(TOP)/src/sqlite.h.in >sqlite.h
index 0836c9e09e84c24549cb574a8e6d3bddcba0062a..f0e0b3dc3a5b3c20baab5c7501e4c12e24991f46 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Automatically\sdetermine\sif\spointers\sare\s4\sor\s8\sbytes\sin\ssize\sduring\sthe\ncompilation\sprocess.\s\sTicket\s#190.\s(CVS\s788)
-D 2002-11-20T11:55:19
+C Add\sthe\s"space_used.tcl"\sscript\sto\sthe\stools\sdirectory.\s\sThis\sscript\sis\sused\nto\smeasure\show\smuch\sdisk\sspace\sis\sused\sby\seach\stable\sand\sindex\sof\sa\sdatabase.\s(CVS\s789)
+D 2002-11-24T14:52:27
 F Makefile.in 868c17a1ae1c07603d491274cc8f86c04acf2a1e
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -14,7 +14,7 @@ F doc/report1.txt a031aaf37b185e4fa540223cb516d3bccec7eeac
 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
 F libtool c56e618713c9510a103bda6b95f3ea3900dcacd6
 F ltmain.sh e9ed72eb1d690f447c13945eaf69e28af531eda1
-F main.mk e0f1f0b2fe39593b5d1c41e467d409210656d3be
+F main.mk 9d13839b9697af332d788fe6e801e68da027cc5c
 F publish.sh e5b83867d14708ed58cec8cba0a4f201e969474d
 F spec.template 238f7db425a78dc1bb7682e56e3834c7270a3f5e
 F sqlite.1 83f4a9d37bdf2b7ef079a82d54eaf2e3509ee6ea
@@ -46,7 +46,7 @@ F src/table.c eed2098c9b577aa17f8abe89313a9c4413f57d63
 F src/tclsqlite.c 9f2c00a92338c51171ded8943bd42d77f7e69e64
 F src/test1.c a46e9f61915b32787c5d5a05a4b92e4dacc437d9
 F src/test2.c 8f7d88895a49b3eed111469f2ab1071cb780ed12
-F src/test3.c 540fa7fc3cb3732517b779b5f90ad9cc4303d0ab
+F src/test3.c 03d4f962f482599df9027a5814490c441a58cd99
 F src/threadtest.c d641a5219e718e18a1a80a50eb9bb549f451f42e
 F src/tokenize.c 75e3bb37305b64e118e709752066f494c4f93c30
 F src/trigger.c 5ba917fc226b96065108da28186c2efaec53e481
@@ -122,6 +122,7 @@ F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
 F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816
 F tool/showdb.c 3559eac5a3b46e9b558d50856946b25e77633236
 F tool/showjournal.c 9a37d7b05de0591e3102aaf774d01fbc0d053a8b
+F tool/space_used.tcl f714c41a59e326b8b9042f415b628b561bafa06b
 F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F www/arch.fig d5f9752a4dbf242e9cfffffd3f5762b6c63b3bcf
@@ -149,7 +150,7 @@ F www/speed.tcl a20a792738475b68756ea7a19321600f23d1d803
 F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P da4a79e2891aa81e2e6d96689f99b3924f940dd5
-R e6e632d6bef956a28043c04d8612ec4c
+P dd5396a73a782b6abe9da3de43a5ee11e0dddbb2
+R f02620fdf50f08e680c6e4c887b23004
 U drh
-Z 48fdd2120a0a70b5abec7fb92ba361ca
+Z d6b1541e76d56cb79d446daffe01fa52
index af53f9ba277c57fc4a587507c04cb5d2a1abc1a1..1e7f57eee66d64751dae9c63e05738152da95f2e 100644 (file)
@@ -1 +1 @@
-dd5396a73a782b6abe9da3de43a5ee11e0dddbb2
\ No newline at end of file
+83b2c27a568cd67cd5162d513766b23ff9fc2227
\ No newline at end of file
index e918a10b5a39a97be2f95c0437f29c6d85a7f5ea..f4a9cb15ab0e73554c5cad35753b673a5d4c75c1 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test3.c,v 1.19 2002/08/31 18:53:08 drh Exp $
+** $Id: test3.c,v 1.20 2002/11/24 14:52:27 drh Exp $
 */
 #include "sqliteInt.h"
 #include "pager.h"
@@ -822,7 +822,6 @@ static int btree_payload_size(
   sqliteBtreeDataSize(pCur, &n2);
   sprintf(zBuf, "%d", n1+n2);
   Tcl_AppendResult(interp, zBuf, 0);
-  free(zBuf);
   return SQLITE_OK;
 }
 
diff --git a/tool/space_used.tcl b/tool/space_used.tcl
new file mode 100644 (file)
index 0000000..2044aa3
--- /dev/null
@@ -0,0 +1,111 @@
+# Run this TCL script using "testfixture" in order get a report that shows
+# how much disk space is used by a particular data to actually store data
+# versus how much space is unused.
+#
+
+# Get the name of the database to analyze
+#
+if {[llength $argv]!=1} {
+  puts stderr "Usage: $argv0 database-name"
+  exit 1
+}
+set file_to_analyze [lindex $argv 0]
+
+# Open the database
+#
+sqlite db [lindex $argv 0]
+set DB [btree_open [lindex $argv 0]]
+
+# Output the schema for the generated report
+#
+puts \
+{BEGIN;
+CREATE TABLE space_used(
+   name clob,        -- Name of a table or index in the database file
+   is_index boolean, -- TRUE if it is an index, false for a table
+   payload int,      -- Total amount of data stored in this table or index
+   pri_pages int,    -- Number of primary pages used
+   ovfl_pages int,   -- Number of overflow pages used
+   pri_unused int,   -- Number of unused bytes on primary pages
+   ovfl_unused int   -- Number of unused bytes on overflow pages
+);}
+
+# This query will be used to find the root page number for every index and
+# table in the database.
+#
+set sql {
+  SELECT name, type, rootpage FROM sqlite_master
+  UNION ALL
+  SELECT 'sqlite_master', 'table', 2
+  ORDER BY 1
+}
+
+# Initialize variables used for summary statistics.
+#
+set total_size 0
+set total_primary 0
+set total_overflow 0
+set total_unused_primary 0
+set total_unused_ovfl 0
+
+# Analyze every table in the database, one at a time.
+#
+foreach {name type rootpage} [db eval $sql] {
+  set cursor [btree_cursor $DB $rootpage 0]
+  set go [btree_first $cursor]
+  set size 0
+  catch {unset pg_used}
+  set unused_ovfl 0
+  set n_overflow 0
+  while {$go==0} {
+    set payload [btree_payload_size $cursor]
+    incr size $payload
+    set stat [btree_cursor_dump $cursor]
+    set pgno [lindex $stat 0]
+    set freebytes [lindex $stat 4]
+    set pg_used($pgno) $freebytes
+    if {$payload>238} {
+      set n [expr {($payload-238+1019)/1020}]
+      incr n_overflow $n
+      incr unused_ovfl [expr {$n*1020+238-$payload}]
+    }
+    set go [btree_next $cursor]
+  }
+  btree_close_cursor $cursor
+  set n_primary [llength [array names pg_used]]
+  set unused_primary 0
+  foreach x [array names pg_used] {incr unused_primary $pg_used($x)}
+  regsub -all ' $name '' name
+  puts -nonewline "INSERT INTO space_used VALUES('$name'"
+  puts -nonewline ",[expr {$type=="index"}]"
+  puts ",$size,$n_primary,$n_overflow,$unused_primary,$unused_ovfl);"
+  incr total_size $size
+  incr total_primary $n_primary
+  incr total_overflow $n_overflow
+  incr total_unused_primary $unused_primary
+  incr total_unused_ovfl $unused_ovfl
+}
+
+# Output summary statistics:
+#
+puts "-- Total payload size: $total_size"
+puts "-- Total pages used: $total_primary primary and $total_overflow overflow"
+set file_pgcnt [expr {[file size [lindex $argv 0]]/1024}]
+puts -nonewline "-- Total unused bytes on primary pages: $total_unused_primary"
+if {$total_primary>0} {
+  set upp [expr {$total_unused_primary/$total_primary}]
+  puts " (avg $upp bytes/page)"
+} else {
+  puts ""
+}
+puts -nonewline "-- Total unused bytes on overflow pages: $total_unused_ovfl"
+if {$total_overflow>0} {
+  set upp [expr {$total_unused_ovfl/$total_overflow}]
+  puts " (avg $upp bytes/page)"
+} else {
+  puts ""
+}
+set n_free [expr {$file_pgcnt-$total_primary-$total_overflow}]
+if {$n_free>0} {incr n_free -1}
+puts "-- Total pages on freelist: $n_free"
+puts "COMMIT;"