Annotation of embedaddon/sqlite3/tool/space_used.tcl, revision 1.1
1.1 ! misho 1: # Run this TCL script using "testfixture" in order get a report that shows
! 2: # how much disk space is used by a particular data to actually store data
! 3: # versus how much space is unused.
! 4: #
! 5:
! 6: # Get the name of the database to analyze
! 7: #
! 8: if {[llength $argv]!=1} {
! 9: puts stderr "Usage: $argv0 database-name"
! 10: exit 1
! 11: }
! 12: set file_to_analyze [lindex $argv 0]
! 13:
! 14: # Open the database
! 15: #
! 16: sqlite db [lindex $argv 0]
! 17: set DB [btree_open [lindex $argv 0]]
! 18:
! 19: # Output the schema for the generated report
! 20: #
! 21: puts \
! 22: {BEGIN;
! 23: CREATE TABLE space_used(
! 24: name clob, -- Name of a table or index in the database file
! 25: is_index boolean, -- TRUE if it is an index, false for a table
! 26: payload int, -- Total amount of data stored in this table or index
! 27: pri_pages int, -- Number of primary pages used
! 28: ovfl_pages int, -- Number of overflow pages used
! 29: pri_unused int, -- Number of unused bytes on primary pages
! 30: ovfl_unused int -- Number of unused bytes on overflow pages
! 31: );}
! 32:
! 33: # This query will be used to find the root page number for every index and
! 34: # table in the database.
! 35: #
! 36: set sql {
! 37: SELECT name, type, rootpage FROM sqlite_master
! 38: UNION ALL
! 39: SELECT 'sqlite_master', 'table', 2
! 40: ORDER BY 1
! 41: }
! 42:
! 43: # Initialize variables used for summary statistics.
! 44: #
! 45: set total_size 0
! 46: set total_primary 0
! 47: set total_overflow 0
! 48: set total_unused_primary 0
! 49: set total_unused_ovfl 0
! 50:
! 51: # Analyze every table in the database, one at a time.
! 52: #
! 53: foreach {name type rootpage} [db eval $sql] {
! 54: set cursor [btree_cursor $DB $rootpage 0]
! 55: set go [btree_first $cursor]
! 56: set size 0
! 57: catch {unset pg_used}
! 58: set unused_ovfl 0
! 59: set n_overflow 0
! 60: while {$go==0} {
! 61: set payload [btree_payload_size $cursor]
! 62: incr size $payload
! 63: set stat [btree_cursor_dump $cursor]
! 64: set pgno [lindex $stat 0]
! 65: set freebytes [lindex $stat 4]
! 66: set pg_used($pgno) $freebytes
! 67: if {$payload>238} {
! 68: set n [expr {($payload-238+1019)/1020}]
! 69: incr n_overflow $n
! 70: incr unused_ovfl [expr {$n*1020+238-$payload}]
! 71: }
! 72: set go [btree_next $cursor]
! 73: }
! 74: btree_close_cursor $cursor
! 75: set n_primary [llength [array names pg_used]]
! 76: set unused_primary 0
! 77: foreach x [array names pg_used] {incr unused_primary $pg_used($x)}
! 78: regsub -all ' $name '' name
! 79: puts -nonewline "INSERT INTO space_used VALUES('$name'"
! 80: puts -nonewline ",[expr {$type=="index"}]"
! 81: puts ",$size,$n_primary,$n_overflow,$unused_primary,$unused_ovfl);"
! 82: incr total_size $size
! 83: incr total_primary $n_primary
! 84: incr total_overflow $n_overflow
! 85: incr total_unused_primary $unused_primary
! 86: incr total_unused_ovfl $unused_ovfl
! 87: }
! 88:
! 89: # Output summary statistics:
! 90: #
! 91: puts "-- Total payload size: $total_size"
! 92: puts "-- Total pages used: $total_primary primary and $total_overflow overflow"
! 93: set file_pgcnt [expr {[file size [lindex $argv 0]]/1024}]
! 94: puts -nonewline "-- Total unused bytes on primary pages: $total_unused_primary"
! 95: if {$total_primary>0} {
! 96: set upp [expr {$total_unused_primary/$total_primary}]
! 97: puts " (avg $upp bytes/page)"
! 98: } else {
! 99: puts ""
! 100: }
! 101: puts -nonewline "-- Total unused bytes on overflow pages: $total_unused_ovfl"
! 102: if {$total_overflow>0} {
! 103: set upp [expr {$total_unused_ovfl/$total_overflow}]
! 104: puts " (avg $upp bytes/page)"
! 105: } else {
! 106: puts ""
! 107: }
! 108: set n_free [expr {$file_pgcnt-$total_primary-$total_overflow}]
! 109: if {$n_free>0} {incr n_free -1}
! 110: puts "-- Total pages on freelist: $n_free"
! 111: puts "COMMIT;"
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>