#-------------------------------------------------------------------------- # 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 " 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"