xref: /sqlite-3.40.0/test/speed3.test (revision 8e16b2d3)
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