Annotation of embedaddon/sqlite3/ext/fts3/fts3speed.tcl, revision 1.1

1.1     ! misho       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>