]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add speed3.test file. For testing performance issues related to overflow pages. ...
authordanielk1977 <danielk1977@noemail.net>
Thu, 17 May 2007 14:45:12 +0000 (14:45 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 17 May 2007 14:45:12 +0000 (14:45 +0000)
FossilOrigin-Name: 684f765df3e8a4836f254717d175a4a7b5e7d15f

manifest
manifest.uuid
src/test3.c
test/speed3.test [new file with mode: 0644]

index e51306ad1d95112c1fdb1ec30a6c04f0dcbcfee9..5429e683f38124c2c662e11eee800b55b043bede 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Modify\stest\sscripts\sto\sallow\sfor\sthe\sfact\sthat\szeroblob()\sis\snot\savailable\swhen\scompiled\swith\sOMIT_INCRBLOB.\sTicket\s#2365.\s(CVS\s4019)
-D 2007-05-17T06:44:28
+C Add\sspeed3.test\sfile.\sFor\stesting\sperformance\sissues\srelated\sto\soverflow\spages.\s(CVS\s4020)
+D 2007-05-17T14:45:13
 F Makefile.in 87b200ad9970907f76df734d29dff3d294c10935
 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -109,7 +109,7 @@ F src/table.c a8de75bcedf84d4060d804264b067ab3b1a3561d
 F src/tclsqlite.c f425c7583665ef78dd8397b2de0b8e0028e80ce2
 F src/test1.c 84c841e1088f743200b87581506e93f70344bd32
 F src/test2.c 24458b17ab2f3c90cbc1c8446bd7ffe69be62f88
-F src/test3.c 946ea9d1a8c928656e3c70f0a2fcb8e733a15e86
+F src/test3.c a280931fb40222b7c90da45eea926459beee8904
 F src/test4.c 8b784cd82de158a2317cb4ac4bc86f91ad315e25
 F src/test5.c c40a4cf43266c1c6da7bcb737d294304a177e6cc
 F src/test6.c 5957d249d437e4db74045ce2f1f661648d94bf94
@@ -345,6 +345,7 @@ F test/shared_err.test cc528f6e78665787e93d9ce3a782a2ce5179d821
 F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5
 F test/speed1.test 22e1b27af0683ed44dcd2f93ed817a9c3e65084a
 F test/speed2.test 53177056baf6556dcbdcf032bbdfc41c1aa74ded
+F test/speed3.test 2c1947ad95b0d5cbd41a485c62402911ef9fd541
 F test/sqllimits1.test b15a5784e47199d68fa1182157ba7e790f467d9f
 F test/subquery.test ae324ee928c5fb463a3ce08a8860d6e7f1ca5797
 F test/subselect.test 974e87f8fc91c5f00dd565316d396a5a6c3106c4
@@ -492,7 +493,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 73e654fbdc791daa10c49557bf479f152586ac28
-R c13d834540a30a1f8b30b83cb25a8ca2
+P 2ee959be4afa2cf05d183ff92a31dd1b5a84becf
+R da5d5d48e56670e943a5c8c37e2f8834
 U danielk1977
-Z 77d3bac28b115aab1826c7188efad160
+Z 35759e4b823e1a75e52d456c8ba860fe
index 4f45aadd87443b92220002c5e26a360c959773f9..012e97034cedd88c44c063ee8a586efdea158093 100644 (file)
@@ -1 +1 @@
-2ee959be4afa2cf05d183ff92a31dd1b5a84becf
\ No newline at end of file
+684f765df3e8a4836f254717d175a4a7b5e7d15f
\ No newline at end of file
index 4fb878fb570d43da67fc4358ef0caa0538159ed3..720cad93571321ab474e071192aac97be13f93dc 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test3.c,v 1.74 2007/05/02 01:34:32 drh Exp $
+** $Id: test3.c,v 1.75 2007/05/17 14:45:13 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include "pager.h"
@@ -1425,10 +1425,11 @@ static int btree_from_db(
   Tcl_CmdInfo info;
   sqlite3 *db;
   Btree *pBt;
+  int iDb = 0;
 
-  if( argc!=2 ){
+  if( argc!=2 && argc!=3 ){
     Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
-       " DB-HANDLE\"", 0);
+       " DB-HANDLE ?N?\"", 0);
     return TCL_ERROR;
   }
 
@@ -1436,10 +1437,14 @@ static int btree_from_db(
     Tcl_AppendResult(interp, "No such db-handle: \"", argv[1], "\"", 0);
     return TCL_ERROR;
   }
+  if( argc==3 ){
+    iDb = atoi(argv[2]);
+  }
+
   db = *((sqlite3 **)info.objClientData);
   assert( db );
 
-  pBt = db->aDb[0].pBt;
+  pBt = db->aDb[iDb].pBt;
   sqlite3_snprintf(sizeof(zBuf), zBuf, "%p", pBt);
   Tcl_SetResult(interp, zBuf, TCL_VOLATILE);
   return TCL_OK;
diff --git a/test/speed3.test b/test/speed3.test
new file mode 100644 (file)
index 0000000..26557a0
--- /dev/null
@@ -0,0 +1,165 @@
+# 2007 May 17
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#*************************************************************************
+# This file implements regression tests for SQLite library. The 
+# focus of this script is testing that the overflow-page related
+# enhancements added after version 3.3.17 speed things up.
+#
+# $Id: speed3.test,v 1.1 2007/05/17 14:45:13 danielk1977 Exp $
+#
+
+#---------------------------------------------------------------------
+# Test plan:
+#
+# If auto-vacuum is enabled for the database, the following cases
+# should show performance improvement with respect to 3.3.17.
+#
+#   + When deleting rows that span overflow pages. This is faster
+#     because the overflow pages no longer need to be read before
+#     they can be moved to the free list (test cases speed3-1.X). 
+#
+#   + When reading a column value stored on an overflow page that
+#     is not the first overflow page for the row. The improvement
+#     in this case is because the overflow pages between the tree
+#     page and the overflow page containing the value do not have
+#     to be read (test cases speed3-2.X).
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+speed_trial_init speed1
+
+# Set a uniform random seed
+expr srand(0)
+
+set ::NROW 1000
+
+# The number_name procedure below converts its argment (an integer)
+# into a string which is the English-language name for that number.
+#
+# Example:
+#
+#     puts [number_name 123]   ->  "one hundred twenty three"
+#
+set ones {zero one two three four five six seven eight nine
+          ten eleven twelve thirteen fourteen fifteen sixteen seventeen
+          eighteen nineteen}
+set tens {{} ten twenty thirty forty fifty sixty seventy eighty ninety}
+proc number_name {n} {
+  if {$n>=1000} {
+    set txt "[number_name [expr {$n/1000}]] thousand"
+    set n [expr {$n%1000}]
+  } else {
+    set txt {}
+  }
+  if {$n>=100} {
+    append txt " [lindex $::ones [expr {$n/100}]] hundred"
+    set n [expr {$n%100}]
+  }
+  if {$n>=20} {
+    append txt " [lindex $::tens [expr {$n/10}]]"
+    set n [expr {$n%10}]
+  }
+  if {$n>0} {
+    append txt " [lindex $::ones $n]"
+  }
+  set txt [string trim $txt]
+  if {$txt==""} {set txt zero}
+  return $txt
+}
+
+proc populate_t1 {db} {
+  $db transaction {
+    for {set ii 0} {$ii < $::NROW} {incr ii} {
+      set N [number_name $ii]
+      set repeats [expr {(10000/[string length $N])+1}]
+      set text [string range [string repeat $N $repeats] 0 10000]
+      $db eval {INSERT INTO main.t1 VALUES($ii, $text, $ii)}
+    }
+    $db eval {INSERT INTO aux.t1 SELECT * FROM main.t1}
+  }
+}
+
+
+proc io_log {db} {
+  array set stats1 [btree_pager_stats [btree_from_db db]]
+  array set stats2 [btree_pager_stats [btree_from_db db 2]]
+# puts "1: [array get stats1]"
+# puts "2: [array get stats2]"
+  puts "Incrvacuum: Read $stats1(read), wrote $stats1(write)"
+  puts "Normal    : Read $stats2(read), wrote $stats2(write)"
+}
+
+proc reset_db {} {
+  db close
+  sqlite3 db test.db
+  db eval { 
+    PRAGMA main.cache_size = 200000;
+    PRAGMA main.auto_vacuum = 'incremental';
+    ATTACH 'test2.db' AS 'aux'; 
+    PRAGMA aux.auto_vacuum = 'none';
+  }
+}
+
+file delete -force test2.db test2.db-journal
+reset_db
+
+# Set up a database in auto-vacuum mode and create a database schema.
+#
+do_test speed3-0.1 {
+  execsql {
+    CREATE TABLE main.t1(a INTEGER, b TEXT, c INTEGER);
+  }
+  execsql {
+    SELECT name FROM sqlite_master ORDER BY 1;
+  }
+} {t1}
+do_test speed3-0.2 {
+  execsql {
+    CREATE TABLE aux.t1(a INTEGER, b TEXT, c INTEGER);
+  }
+  execsql {
+    SELECT name FROM aux.sqlite_master ORDER BY 1;
+  }
+} {t1}
+do_test speed3-0.3 {
+  populate_t1 db
+  execsql {
+    SELECT count(*) FROM main.t1;
+    SELECT count(*) FROM aux.t1;
+  }
+} "$::NROW $::NROW"
+do_test speed3-0.4 {
+  execsql {
+    PRAGMA main.auto_vacuum;
+    PRAGMA aux.auto_vacuum;
+  }
+} {2 0}
+
+# Delete all content in a table, one row at a time.
+#
+#io_log db
+reset_db
+speed_trial speed3-1.incrvacuum $::NROW row {DELETE FROM main.t1 WHERE 1}
+speed_trial speed3-1.normal     $::NROW row {DELETE FROM aux.t1 WHERE 1}
+io_log db
+
+# Select the "C" column (located at the far end of the overflow 
+# chain) from each table row.
+#
+db eval {PRAGMA incremental_vacuum(500000)}
+populate_t1 db
+reset_db
+speed_trial speed3-2.incrvacuum $::NROW row {SELECT c FROM main.t1}
+speed_trial speed3-2.normal     $::NROW row {SELECT c FROM aux.t1}
+io_log db
+
+finish_test
+