modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/fts3/fts3speed.tcl (about)

     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