Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Enhance the sqlite3_analyzer tool to give reports on the sizes of individual indices. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
3b4096cc8a3b4517cdf49dcfe1f33279 |
User & Date: | drh 2013-07-17 18:12:15.911 |
Context
2013-07-17
| ||
21:08 | Fix copy/paste errors in comments in the transitive_closure virtual table. No changes to code. (check-in: b1b0de29fd user: drh tags: trunk) | |
18:12 | Enhance the sqlite3_analyzer tool to give reports on the sizes of individual indices. (check-in: 3b4096cc8a user: drh tags: trunk) | |
11:54 | Clear the error string pointer in sqlite3_vtab object after the error string is transferred to SQLite. Ticket [78588b938a11]. (check-in: 64bf8148b8 user: drh tags: trunk) | |
Changes
Changes to tool/spaceanal.tcl.
︙ | ︙ | |||
242 243 244 245 246 247 248 | # Quote a string for use in an SQL query. Examples: # # [quote {hello world}] == {'hello world'} # [quote {hello world's}] == {'hello world''s'} # proc quote {txt} { | | > | > > > > > > > > > > | | 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | # Quote a string for use in an SQL query. Examples: # # [quote {hello world}] == {'hello world'} # [quote {hello world's}] == {'hello world''s'} # proc quote {txt} { return [string map {' ''} $txt] } # Output a title line # proc titleline {title} { if {$title==""} { puts [string repeat * 79] } else { set len [string length $title] set stars [string repeat * [expr 79-$len-5]] puts "*** $title $stars" } } # Generate a single line of output in the statistics section of the # report. # proc statline {title value {extra {}}} { set len [string length $title] set dots [string repeat . [expr 50-$len]] set len [string length $value] set sp2 [string range { } $len end] if {$extra ne ""} { set extra " $extra" } puts "$title$dots $value$sp2$extra" } |
︙ | ︙ | |||
315 316 317 318 319 320 321 | int(sum(gap_cnt)) AS gap_cnt, int(sum(compressed_size)) AS compressed_size FROM space_used WHERE $where" {} {} # Output the sub-report title, nicely decorated with * characters. # puts "" | < < | | 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 | int(sum(gap_cnt)) AS gap_cnt, int(sum(compressed_size)) AS compressed_size FROM space_used WHERE $where" {} {} # Output the sub-report title, nicely decorated with * characters. # puts "" titleline $title puts "" # Calculate statistics and store the results in TCL variables, as follows: # # total_pages: Database pages consumed. # total_pages_percent: Pages consumed as a percentage of the file. # storage: Bytes consumed. |
︙ | ︙ | |||
486 487 488 489 490 491 492 | set user_payload [mem one {SELECT int(sum(payload)) FROM space_used WHERE NOT is_index AND name NOT LIKE 'sqlite_master'}] set user_percent [percent $user_payload $file_bytes] # Output the summary statistics calculated above. # puts "/** Disk-Space Utilization Report For $root_filename" | < < < | 495 496 497 498 499 500 501 502 503 504 505 506 507 508 | set user_payload [mem one {SELECT int(sum(payload)) FROM space_used WHERE NOT is_index AND name NOT LIKE 'sqlite_master'}] set user_percent [percent $user_payload $file_bytes] # Output the summary statistics calculated above. # puts "/** Disk-Space Utilization Report For $root_filename" puts "" 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 |
︙ | ︙ | |||
513 514 515 516 517 518 519 | statline {Size of the file in bytes} $file_bytes } statline {Bytes of user payload stored} $user_payload $user_percent # Output table rankings # puts "" | | > > > > > > > > > > > | | 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 | statline {Size of the file in bytes} $file_bytes } statline {Bytes of user payload stored} $user_payload $user_percent # Output table rankings # puts "" titleline "Page counts for all tables with their indices" puts "" mem eval {SELECT tblname, count(*) AS cnt, int(sum(int_pages+leaf_pages+ovfl_pages)) AS size FROM space_used GROUP BY tblname ORDER BY size+0 DESC, tblname} {} { statline [string toupper $tblname] $size [percent $size $file_pgcnt] } puts "" titleline "Page counts for all tables and indices separately" puts "" mem eval { SELECT upper(name) AS nm, int(int_pages+leaf_pages+ovfl_pages) AS size FROM space_used ORDER BY size+0 DESC, name} {} { statline $nm $size [percent $size $file_pgcnt] } if {$isCompressed} { puts "" titleline "Bytes of disk space used after compression" puts "" set csum 0 mem eval {SELECT tblname, int(sum(compressed_size)) + $compressOverhead*sum(int_pages+leaf_pages+ovfl_pages) AS csize FROM space_used GROUP BY tblname ORDER BY csize+0 DESC, tblname} {} { |
︙ | ︙ | |||
550 551 552 553 554 555 556 | } subreport {All tables} {NOT is_index} if {$nindex>0} { subreport {All indices} {is_index} } foreach tbl [mem eval {SELECT name FROM space_used WHERE NOT is_index ORDER BY name}] { | | | > > > > | > > > > > | | | | 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 | } subreport {All tables} {NOT is_index} if {$nindex>0} { subreport {All indices} {is_index} } foreach tbl [mem eval {SELECT name FROM space_used WHERE NOT is_index ORDER BY name}] { set qn [quote $tbl] set name [string toupper $tbl] set n [mem eval {SELECT count(*) FROM space_used WHERE tblname=$tbl}] if {$n>1} { set idxlist [mem eval "SELECT name FROM space_used WHERE tblname='$qn' AND is_index ORDER BY 1"] subreport "Table $name and all its indices" "tblname='$qn'" subreport "Table $name w/o any indices" "name='$qn'" if {[llength $idxlist]>1} { subreport "Indices of table $name" "tblname='$qn' AND is_index" } foreach idx $idxlist { set qidx [quote $idx] subreport "Index [string toupper $idx] of table $name" "name='$qidx'" } } else { subreport "Table $name" "name='$qn'" } } # Output instructions on what the numbers above mean. # puts "" titleline Definitions puts { Page size in bytes The number of bytes in a single page of the database file. Usually 1024. Number of pages in the whole file } |
︙ | ︙ | |||
718 719 720 721 722 723 724 | pages. The percentage at the right is the number of unused bytes divided by the total number of bytes. } # Output a dump of the in-memory database. This can be used for more # complex offline analysis. # | | | 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 | pages. The percentage at the right is the number of unused bytes divided by the total number of bytes. } # Output a dump of the in-memory database. This can be used for more # complex offline analysis. # titleline {} puts "The entire text of this report can be sourced into any SQL database" puts "engine for further analysis. All of the text above is an SQL comment." puts "The data used to generate this report follows:" puts "*/" puts "BEGIN;" puts $tabledef unset -nocomplain x |
︙ | ︙ |