Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Update the space-analyzer tool to support auto-vacuum databases. (CVS 2080) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
1cb8086612c7dec170da0910cf0cbe4e |
User & Date: | danielk1977 2004-11-08 16:15:09.000 |
Context
2004-11-09
| ||
07:42 | Refactor the space-analysis script for readability. (CVS 2081) (check-in: 63f2ee22e2 user: danielk1977 tags: trunk) | |
2004-11-08
| ||
16:15 | Update the space-analyzer tool to support auto-vacuum databases. (CVS 2080) (check-in: 1cb8086612 user: danielk1977 tags: trunk) | |
12:32 | A few more auto-vacuum tests. (CVS 2079) (check-in: 9d4a60bbd6 user: danielk1977 tags: trunk) | |
Changes
Changes to tool/spaceanal.tcl.
1 2 3 4 5 6 7 | # 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 # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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 # #set argv $argv0 if {[llength $argv]!=1} { puts stderr "Usage: $argv0 database-name" exit 1 } set file_to_analyze [lindex $argv 0] if {![file exists $file_to_analyze]} { puts stderr "No such file: $file_to_analyze" |
︙ | ︙ | |||
317 318 319 320 321 322 323 324 325 326 327 328 329 | [percent $leaf_unused [expr {$leaf_pages*$pageSize}] {of primary space}] statline "Unused bytes on overflow pages" $ovfl_unused \ [percent $ovfl_unused [expr {$ovfl_pages*$pageSize}] {of overflow space}] statline "Unused bytes on all pages" $total_unused \ [percent $total_unused $storage {of all space}] return 1 } # Output summary statistics: # puts "/** Disk-Space Utilization Report For $file_to_analyze" puts "*** As of [clock format [clock seconds] -format {%Y-%b-%d %H:%M:%S}]" puts "" | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > | | | > > > | | < | | | | | | | | < | | | | < < | < > | > > > > > > > > > > > > | | 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | [percent $leaf_unused [expr {$leaf_pages*$pageSize}] {of primary space}] statline "Unused bytes on overflow pages" $ovfl_unused \ [percent $ovfl_unused [expr {$ovfl_pages*$pageSize}] {of overflow space}] statline "Unused bytes on all pages" $total_unused \ [percent $total_unused $storage {of all space}] return 1 } # Calculate the overhead in pages caused by auto-vacuum. # # This procedure calculates and returns the number of pages used by the # auto-vacuum 'pointer-map'. If the database does not support auto-vacuum, # then 0 is returned. The two arguments are the size of the database file in # bytes and the page size used by the database (also in bytes). proc autovacuum_overhead {filePages pageSize} { # Read the value of meta 4. If non-zero, then the database supports # auto-vacuum. It would be possible to use "PRAGMA auto_vacuum" instead, # but that would not work if the SQLITE_OMIT_PRAGMA macro was defined # when the library was built. set meta4 [lindex [btree_get_meta $::DB] 4] # If the database is not an auto-vacuum database or the file consists # of one page only then there is no overhead for auto-vacuum. Return zero. if {0==$meta4 || $filePages==1} { return 0 } # The number of entries on each pointer map page. The layout of the # database file is one pointer-map page, followed by $ptrsPerPage other # pages, followed by a pointer-map page etc. The first pointer-map page # is the second page of the file overall. set ptrsPerPage [expr double($pageSize/5)] # Return the number of pointer map pages in the database. return [expr int(ceil( ($filePages-1.0)/($ptrsPerPage+1.0) ))] } # Output summary statistics: # puts "/** Disk-Space Utilization Report For $file_to_analyze" puts "*** As of [clock format [clock seconds] -format {%Y-%b-%d %H:%M:%S}]" puts "" # Variables: # # pageSize: Size of each page in bytes. # file_bytes: File size in bytes. # file_pgcnt: Number of pages in the file. # file_pgcnt2: Number of pages in the file (calculated). # av_pgcnt: Pages consumed by the auto-vacuum pointer-map. # av_percent: Percentage of the file consumed by auto-vacuum pointer-map. # inuse_pgcnt: Data pages in the file. # inuse_percent: Percentage of pages used to store data. # free_pgcnt: Free pages calculated as (<total pages> - <in-use pages>) # free_pgcnt2: Free pages in the file according to the file header. # free_percent: Percentage of file consumed by free pages (calculated). # free_percent2: Percentage of file consumed by free pages (header). # ntable: Number of tables in the db. # nindex: Number of indices in the db. # nautoindex: Number of indices created automatically. # nmanindex: Number of indices created manually. # user_payload: set file_bytes [file size $file_to_analyze] set file_pgcnt [expr {$file_bytes/$pageSize}] set av_pgcnt [autovacuum_overhead $file_pgcnt $pageSize] set av_percent [percent $av_pgcnt $file_pgcnt] set q {SELECT sum(leaf_pages+int_pages+ovfl_pages) FROM space_used} set inuse_pgcnt [expr [mem eval $q]] set inuse_percent [percent $inuse_pgcnt $file_pgcnt] set free_pgcnt [expr $file_pgcnt-$inuse_pgcnt-$av_pgcnt] set free_percent [percent $free_pgcnt $file_pgcnt] set free_pgcnt2 [lindex [btree_get_meta $DB] 0] set free_percent2 [percent $free_pgcnt2 $file_pgcnt] set file_pgcnt2 [expr {$inuse_pgcnt+$free_pgcnt2+$av_pgcnt}] set ntable [db eval {SELECT count(*)+1 FROM sqlite_master WHERE type='table'}] set nindex [db eval {SELECT count(*) FROM sqlite_master WHERE type='index'}] set q {SELECT count(*) FROM sqlite_master WHERE name LIKE 'sqlite_autoindex%'} set nautoindex [db eval $q] set nmanindex [expr {$nindex-$nautoindex}] # set total_payload [mem eval "SELECT sum(payload) FROM space_used"] set user_payload [mem one {SELECT sum(payload) FROM space_used WHERE NOT is_index AND name NOT LIKE 'sqlite_master'}] set user_payload_percent [percent $user_payload $file_bytes] statline {Page size in bytes} $pageSize statline {Pages in the whole file (measured)} $file_pgcnt statline {Pages in the whole file (calculated)} $file_pgcnt2 statline {Pages that store data} $inuse_pgcnt $inuse_percent statline {Pages on the freelist (per header)} $free_pgcnt2 $free_percent2 statline {Pages on the freelist (calculated)} $free_pgcnt $free_percent statline {Pages of auto-vacuum overhead} $av_pgcnt $av_percent statline {Number of tables in the database} $ntable statline {Number of indices} $nindex statline {Number of named indices} $nmanindex statline {Automatically generated indices} $nautoindex statline {Size of the file in bytes} $file_bytes statline {Bytes of user payload stored} $user_payload $user_payload_percent # Output table rankings # puts "" puts "*** Page counts for all tables with their indices ********************" puts "" mem eval {SELECT tblname, count(*) AS cnt, |
︙ | ︙ | |||
418 419 420 421 422 423 424 425 426 427 428 429 430 431 | Pages on the freelist The number of pages that are not currently in use but are reserved for future use. The percentage at the right is the number of freelist pages divided by the total number of pages in the file. Number of tables in the database The number of tables in the database, including the SQLITE_MASTER table used to store schema information. Number of indices | > > > > > | 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 | Pages on the freelist The number of pages that are not currently in use but are reserved for future use. The percentage at the right is the number of freelist pages divided by the total number of pages in the file. Pages of auto-vacuum overhead The number of pages that store data used by the database to facilitate auto-vacuum. This is zero for databases that do not support auto-vacuum. Number of tables in the database The number of tables in the database, including the SQLITE_MASTER table used to store schema information. Number of indices |
︙ | ︙ |