163c64f3bSdanielk1977# 2007 May 17 263c64f3bSdanielk1977# 363c64f3bSdanielk1977# The author disclaims copyright to this source code. In place of 463c64f3bSdanielk1977# a legal notice, here is a blessing: 563c64f3bSdanielk1977# 663c64f3bSdanielk1977# May you do good and not evil. 763c64f3bSdanielk1977# May you find forgiveness for yourself and forgive others. 863c64f3bSdanielk1977# May you share freely, never taking more than you give. 963c64f3bSdanielk1977# 1063c64f3bSdanielk1977#************************************************************************* 1163c64f3bSdanielk1977# This file implements regression tests for SQLite library. The 1263c64f3bSdanielk1977# focus of this script is testing that the overflow-page related 1363c64f3bSdanielk1977# enhancements added after version 3.3.17 speed things up. 1463c64f3bSdanielk1977# 1520a35fd8Sshane# $Id: speed3.test,v 1.6 2009/07/09 02:48:24 shane Exp $ 1663c64f3bSdanielk1977# 1763c64f3bSdanielk1977 1863c64f3bSdanielk1977#--------------------------------------------------------------------- 1963c64f3bSdanielk1977# Test plan: 2063c64f3bSdanielk1977# 2163c64f3bSdanielk1977# If auto-vacuum is enabled for the database, the following cases 2263c64f3bSdanielk1977# should show performance improvement with respect to 3.3.17. 2363c64f3bSdanielk1977# 2463c64f3bSdanielk1977# + When deleting rows that span overflow pages. This is faster 2563c64f3bSdanielk1977# because the overflow pages no longer need to be read before 2663c64f3bSdanielk1977# they can be moved to the free list (test cases speed3-1.X). 2763c64f3bSdanielk1977# 2863c64f3bSdanielk1977# + When reading a column value stored on an overflow page that 2963c64f3bSdanielk1977# is not the first overflow page for the row. The improvement 3063c64f3bSdanielk1977# in this case is because the overflow pages between the tree 3163c64f3bSdanielk1977# page and the overflow page containing the value do not have 3263c64f3bSdanielk1977# to be read (test cases speed3-2.X). 3363c64f3bSdanielk1977# 3463c64f3bSdanielk1977 3563c64f3bSdanielk1977set testdir [file dirname $argv0] 3663c64f3bSdanielk1977source $testdir/tester.tcl 374152e677Sdanielk1977 385a8f9374Sdanielk1977ifcapable !tclvar||!attach { 394152e677Sdanielk1977 finish_test 404152e677Sdanielk1977 return 414152e677Sdanielk1977} 424152e677Sdanielk1977 4363c64f3bSdanielk1977speed_trial_init speed1 4463c64f3bSdanielk1977 4563c64f3bSdanielk1977# Set a uniform random seed 4663c64f3bSdanielk1977expr srand(0) 4763c64f3bSdanielk1977 4863c64f3bSdanielk1977set ::NROW 1000 4963c64f3bSdanielk1977 5063c64f3bSdanielk1977# The number_name procedure below converts its argment (an integer) 5163c64f3bSdanielk1977# into a string which is the English-language name for that number. 5263c64f3bSdanielk1977# 5363c64f3bSdanielk1977# Example: 5463c64f3bSdanielk1977# 5563c64f3bSdanielk1977# puts [number_name 123] -> "one hundred twenty three" 5663c64f3bSdanielk1977# 5763c64f3bSdanielk1977set ones {zero one two three four five six seven eight nine 5863c64f3bSdanielk1977 ten eleven twelve thirteen fourteen fifteen sixteen seventeen 5963c64f3bSdanielk1977 eighteen nineteen} 6063c64f3bSdanielk1977set tens {{} ten twenty thirty forty fifty sixty seventy eighty ninety} 6163c64f3bSdanielk1977proc number_name {n} { 6263c64f3bSdanielk1977 if {$n>=1000} { 6363c64f3bSdanielk1977 set txt "[number_name [expr {$n/1000}]] thousand" 6463c64f3bSdanielk1977 set n [expr {$n%1000}] 6563c64f3bSdanielk1977 } else { 6663c64f3bSdanielk1977 set txt {} 6763c64f3bSdanielk1977 } 6863c64f3bSdanielk1977 if {$n>=100} { 6963c64f3bSdanielk1977 append txt " [lindex $::ones [expr {$n/100}]] hundred" 7063c64f3bSdanielk1977 set n [expr {$n%100}] 7163c64f3bSdanielk1977 } 7263c64f3bSdanielk1977 if {$n>=20} { 7363c64f3bSdanielk1977 append txt " [lindex $::tens [expr {$n/10}]]" 7463c64f3bSdanielk1977 set n [expr {$n%10}] 7563c64f3bSdanielk1977 } 7663c64f3bSdanielk1977 if {$n>0} { 7763c64f3bSdanielk1977 append txt " [lindex $::ones $n]" 7863c64f3bSdanielk1977 } 7963c64f3bSdanielk1977 set txt [string trim $txt] 8063c64f3bSdanielk1977 if {$txt==""} {set txt zero} 8163c64f3bSdanielk1977 return $txt 8263c64f3bSdanielk1977} 8363c64f3bSdanielk1977 8463c64f3bSdanielk1977proc populate_t1 {db} { 8563c64f3bSdanielk1977 $db transaction { 8663c64f3bSdanielk1977 for {set ii 0} {$ii < $::NROW} {incr ii} { 8763c64f3bSdanielk1977 set N [number_name $ii] 8863c64f3bSdanielk1977 set repeats [expr {(10000/[string length $N])+1}] 8963c64f3bSdanielk1977 set text [string range [string repeat $N $repeats] 0 10000] 9063c64f3bSdanielk1977 $db eval {INSERT INTO main.t1 VALUES($ii, $text, $ii)} 9163c64f3bSdanielk1977 } 9263c64f3bSdanielk1977 $db eval {INSERT INTO aux.t1 SELECT * FROM main.t1} 9363c64f3bSdanielk1977 } 9463c64f3bSdanielk1977} 9563c64f3bSdanielk1977 9663c64f3bSdanielk1977 9763c64f3bSdanielk1977proc io_log {db} { 9827641703Sdrh db_enter db 9963c64f3bSdanielk1977 array set stats1 [btree_pager_stats [btree_from_db db]] 10063c64f3bSdanielk1977 array set stats2 [btree_pager_stats [btree_from_db db 2]] 10127641703Sdrh db_leave db 10263c64f3bSdanielk1977# puts "1: [array get stats1]" 10363c64f3bSdanielk1977# puts "2: [array get stats2]" 10463c64f3bSdanielk1977 puts "Incrvacuum: Read $stats1(read), wrote $stats1(write)" 10563c64f3bSdanielk1977 puts "Normal : Read $stats2(read), wrote $stats2(write)" 10663c64f3bSdanielk1977} 10763c64f3bSdanielk1977 108*8e16b2d3Smistachkinproc speed3_reset_db {} { 10963c64f3bSdanielk1977 db close 11063c64f3bSdanielk1977 sqlite3 db test.db 11163c64f3bSdanielk1977 db eval { 11263c64f3bSdanielk1977 PRAGMA main.cache_size = 200000; 11363c64f3bSdanielk1977 PRAGMA main.auto_vacuum = 'incremental'; 11463c64f3bSdanielk1977 ATTACH 'test2.db' AS 'aux'; 11563c64f3bSdanielk1977 PRAGMA aux.auto_vacuum = 'none'; 11663c64f3bSdanielk1977 } 11763c64f3bSdanielk1977} 11863c64f3bSdanielk1977 119fda06befSmistachkinforcedelete test2.db test2.db-journal 120*8e16b2d3Smistachkinspeed3_reset_db 12163c64f3bSdanielk1977 12263c64f3bSdanielk1977# Set up a database in auto-vacuum mode and create a database schema. 12363c64f3bSdanielk1977# 12463c64f3bSdanielk1977do_test speed3-0.1 { 12563c64f3bSdanielk1977 execsql { 12663c64f3bSdanielk1977 CREATE TABLE main.t1(a INTEGER, b TEXT, c INTEGER); 12763c64f3bSdanielk1977 } 12863c64f3bSdanielk1977 execsql { 12963c64f3bSdanielk1977 SELECT name FROM sqlite_master ORDER BY 1; 13063c64f3bSdanielk1977 } 13163c64f3bSdanielk1977} {t1} 13263c64f3bSdanielk1977do_test speed3-0.2 { 13363c64f3bSdanielk1977 execsql { 13463c64f3bSdanielk1977 CREATE TABLE aux.t1(a INTEGER, b TEXT, c INTEGER); 13563c64f3bSdanielk1977 } 13663c64f3bSdanielk1977 execsql { 13763c64f3bSdanielk1977 SELECT name FROM aux.sqlite_master ORDER BY 1; 13863c64f3bSdanielk1977 } 13963c64f3bSdanielk1977} {t1} 14063c64f3bSdanielk1977do_test speed3-0.3 { 14163c64f3bSdanielk1977 populate_t1 db 14263c64f3bSdanielk1977 execsql { 14363c64f3bSdanielk1977 SELECT count(*) FROM main.t1; 14463c64f3bSdanielk1977 SELECT count(*) FROM aux.t1; 14563c64f3bSdanielk1977 } 14663c64f3bSdanielk1977} "$::NROW $::NROW" 14763c64f3bSdanielk1977do_test speed3-0.4 { 14863c64f3bSdanielk1977 execsql { 14963c64f3bSdanielk1977 PRAGMA main.auto_vacuum; 15063c64f3bSdanielk1977 PRAGMA aux.auto_vacuum; 15163c64f3bSdanielk1977 } 15263c64f3bSdanielk1977} {2 0} 15363c64f3bSdanielk1977 15463c64f3bSdanielk1977# Delete all content in a table, one row at a time. 15563c64f3bSdanielk1977# 15663c64f3bSdanielk1977#io_log db 157*8e16b2d3Smistachkinspeed3_reset_db 15863c64f3bSdanielk1977speed_trial speed3-1.incrvacuum $::NROW row {DELETE FROM main.t1 WHERE 1} 15963c64f3bSdanielk1977speed_trial speed3-1.normal $::NROW row {DELETE FROM aux.t1 WHERE 1} 16063c64f3bSdanielk1977io_log db 16163c64f3bSdanielk1977 16263c64f3bSdanielk1977# Select the "C" column (located at the far end of the overflow 16363c64f3bSdanielk1977# chain) from each table row. 16463c64f3bSdanielk1977# 165b39f70b0Sdanielk1977#db eval {PRAGMA incremental_vacuum(500000)} 16663c64f3bSdanielk1977populate_t1 db 167*8e16b2d3Smistachkinspeed3_reset_db 16863c64f3bSdanielk1977speed_trial speed3-2.incrvacuum $::NROW row {SELECT c FROM main.t1} 16963c64f3bSdanielk1977speed_trial speed3-2.normal $::NROW row {SELECT c FROM aux.t1} 17063c64f3bSdanielk1977io_log db 17163c64f3bSdanielk1977 17263c64f3bSdanielk1977finish_test 173