OLD | NEW |
(Empty) | |
| 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 |
OLD | NEW |