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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>