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 |