123 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
| 
 | |
| 
 | |
| #--------------------------------------------------------------------------
 | |
| # This script contains several sub-programs used to test FTS3/FTS4 
 | |
| # performance. It does not run the queries directly, but generates SQL
 | |
| # scripts that can be run using the shell tool.
 | |
| #
 | |
| # The following cases are tested:
 | |
| #
 | |
| #   1. Inserting documents into an FTS3 table.
 | |
| #   2. Optimizing an FTS3 table (i.e. "INSERT INTO t1 VALUES('optimize')").
 | |
| #   3. Deleting documents from an FTS3 table.
 | |
| #   4. Querying FTS3 tables.
 | |
| #
 | |
| 
 | |
| # Number of tokens in vocabulary. And number of tokens in each document.
 | |
| #
 | |
| set VOCAB_SIZE  2000
 | |
| set DOC_SIZE     100
 | |
| 
 | |
| set NUM_INSERTS 100000
 | |
| set NUM_SELECTS 1000
 | |
| 
 | |
| # Force everything in this script to be deterministic.
 | |
| #
 | |
| expr {srand(0)}
 | |
| 
 | |
| proc usage {} {
 | |
|   puts stderr "Usage: $::argv0 <rows> <selects>"
 | |
|   exit -1
 | |
| }
 | |
| 
 | |
| proc sql {sql} {
 | |
|   puts $::fd $sql
 | |
| }
 | |
| 
 | |
| 
 | |
| # Return a list of $nWord randomly generated tokens each between 2 and 10
 | |
| # characters in length.
 | |
| #
 | |
| proc build_vocab {nWord} {
 | |
|   set ret [list]
 | |
|   set chars [list a b c d e f g h i j k l m n o p q r s t u v w x y z]
 | |
|   for {set i 0} {$i<$nWord} {incr i} {
 | |
|     set len [expr {int((rand()*9.0)+2)}]
 | |
|     set term ""
 | |
|     for {set j 0} {$j<$len} {incr j} {
 | |
|       append term [lindex $chars [expr {int(rand()*[llength $chars])}]]
 | |
|     }
 | |
|     lappend ret $term
 | |
|   }
 | |
|   set ret
 | |
| }
 | |
| 
 | |
| proc select_term {} {
 | |
|   set n [llength $::vocab]
 | |
|   set t [expr int(rand()*$n*3)]
 | |
|   if {$t>=2*$n} { set t [expr {($t-2*$n)/100}] }
 | |
|   if {$t>=$n} { set t [expr {($t-$n)/10}] }
 | |
|   lindex $::vocab $t
 | |
| }
 | |
| 
 | |
| proc select_doc {nTerm} {
 | |
|   set ret [list]
 | |
|   for {set i 0} {$i<$nTerm} {incr i} {
 | |
|     lappend ret [select_term]
 | |
|   }
 | |
|   set ret
 | |
| }
 | |
| 
 | |
| proc test_1 {nInsert} {
 | |
|   sql "PRAGMA synchronous = OFF;"
 | |
|   sql "DROP TABLE IF EXISTS t1;"
 | |
|   sql "CREATE VIRTUAL TABLE t1 USING fts4;"
 | |
|   for {set i 0} {$i < $nInsert} {incr i} {
 | |
|     set doc [select_doc $::DOC_SIZE]
 | |
|     sql "INSERT INTO t1 VALUES('$doc');"
 | |
|   }
 | |
| }
 | |
| 
 | |
| proc test_2 {} {
 | |
|   sql "INSERT INTO t1(t1) VALUES('optimize');"
 | |
| }
 | |
| 
 | |
| proc test_3 {nSelect} {
 | |
|   for {set i 0} {$i < $nSelect} {incr i} {
 | |
|     sql "SELECT count(*) FROM t1 WHERE t1 MATCH '[select_term]';"
 | |
|   }
 | |
| }
 | |
| 
 | |
| proc test_4 {nSelect} {
 | |
|   for {set i 0} {$i < $nSelect} {incr i} {
 | |
|     sql "SELECT count(*) FROM t1 WHERE t1 MATCH '[select_term] [select_term]';"
 | |
|   }
 | |
| }
 | |
| 
 | |
| if {[llength $argv]!=0} usage
 | |
| 
 | |
| set ::vocab [build_vocab $::VOCAB_SIZE]
 | |
| 
 | |
| set ::fd [open fts3speed_insert.sql w]
 | |
| test_1 $NUM_INSERTS
 | |
| close $::fd
 | |
| 
 | |
| set ::fd [open fts3speed_select.sql w]
 | |
| test_3 $NUM_SELECTS
 | |
| close $::fd
 | |
| 
 | |
| set ::fd [open fts3speed_select2.sql w]
 | |
| test_4 $NUM_SELECTS
 | |
| close $::fd
 | |
| 
 | |
| set ::fd [open fts3speed_optimize.sql w]
 | |
| test_2
 | |
| close $::fd
 | |
| 
 | |
| puts "Success. Created files:"
 | |
| puts "  fts3speed_insert.sql"
 | |
| puts "  fts3speed_select.sql"
 | |
| puts "  fts3speed_select2.sql"
 | |
| puts "  fts3speed_optimize.sql"
 | |
| 
 | 
