Annotation of embedaddon/sqlite3/tool/space_used.tcl, revision 1.1.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>