Home | History | Annotate | Download | only in fts3
      1 
      2 
      3 #--------------------------------------------------------------------------
      4 # This script contains several sub-programs used to test FTS3/FTS4
      5 # performance. It does not run the queries directly, but generates SQL
      6 # scripts that can be run using the shell tool.
      7 #
      8 # The following cases are tested:
      9 #
     10 #   1. Inserting documents into an FTS3 table.
     11 #   2. Optimizing an FTS3 table (i.e. "INSERT INTO t1 VALUES('optimize')").
     12 #   3. Deleting documents from an FTS3 table.
     13 #   4. Querying FTS3 tables.
     14 #
     15 
     16 # Number of tokens in vocabulary. And number of tokens in each document.
     17 #
     18 set VOCAB_SIZE  2000
     19 set DOC_SIZE     100
     20 
     21 set NUM_INSERTS 100000
     22 set NUM_SELECTS 1000
     23 
     24 # Force everything in this script to be deterministic.
     25 #
     26 expr {srand(0)}
     27 
     28 proc usage {} {
     29   puts stderr "Usage: $::argv0 <rows> <selects>"
     30   exit -1
     31 }
     32 
     33 proc sql {sql} {
     34   puts $::fd $sql
     35 }
     36 
     37 
     38 # Return a list of $nWord randomly generated tokens each between 2 and 10
     39 # characters in length.
     40 #
     41 proc build_vocab {nWord} {
     42   set ret [list]
     43   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]
     44   for {set i 0} {$i<$nWord} {incr i} {
     45     set len [expr {int((rand()*9.0)+2)}]
     46     set term ""
     47     for {set j 0} {$j<$len} {incr j} {
     48       append term [lindex $chars [expr {int(rand()*[llength $chars])}]]
     49     }
     50     lappend ret $term
     51   }
     52   set ret
     53 }
     54 
     55 proc select_term {} {
     56   set n [llength $::vocab]
     57   set t [expr int(rand()*$n*3)]
     58   if {$t>=2*$n} { set t [expr {($t-2*$n)/100}] }
     59   if {$t>=$n} { set t [expr {($t-$n)/10}] }
     60   lindex $::vocab $t
     61 }
     62 
     63 proc select_doc {nTerm} {
     64   set ret [list]
     65   for {set i 0} {$i<$nTerm} {incr i} {
     66     lappend ret [select_term]
     67   }
     68   set ret
     69 }
     70 
     71 proc test_1 {nInsert} {
     72   sql "PRAGMA synchronous = OFF;"
     73   sql "DROP TABLE IF EXISTS t1;"
     74   sql "CREATE VIRTUAL TABLE t1 USING fts4;"
     75   for {set i 0} {$i < $nInsert} {incr i} {
     76     set doc [select_doc $::DOC_SIZE]
     77     sql "INSERT INTO t1 VALUES('$doc');"
     78   }
     79 }
     80 
     81 proc test_2 {} {
     82   sql "INSERT INTO t1(t1) VALUES('optimize');"
     83 }
     84 
     85 proc test_3 {nSelect} {
     86   for {set i 0} {$i < $nSelect} {incr i} {
     87     sql "SELECT count(*) FROM t1 WHERE t1 MATCH '[select_term]';"
     88   }
     89 }
     90 
     91 proc test_4 {nSelect} {
     92   for {set i 0} {$i < $nSelect} {incr i} {
     93     sql "SELECT count(*) FROM t1 WHERE t1 MATCH '[select_term] [select_term]';"
     94   }
     95 }
     96 
     97 if {[llength $argv]!=0} usage
     98 
     99 set ::vocab [build_vocab $::VOCAB_SIZE]
    100 
    101 set ::fd [open fts3speed_insert.sql w]
    102 test_1 $NUM_INSERTS
    103 close $::fd
    104 
    105 set ::fd [open fts3speed_select.sql w]
    106 test_3 $NUM_SELECTS
    107 close $::fd
    108 
    109 set ::fd [open fts3speed_select2.sql w]
    110 test_4 $NUM_SELECTS
    111 close $::fd
    112 
    113 set ::fd [open fts3speed_optimize.sql w]
    114 test_2
    115 close $::fd
    116 
    117 puts "Success. Created files:"
    118 puts "  fts3speed_insert.sql"
    119 puts "  fts3speed_select.sql"
    120 puts "  fts3speed_select2.sql"
    121 puts "  fts3speed_optimize.sql"
    122 
    123