Posted to tcl by Stu at Thu Sep 08 17:54:13 GMT 2022view pretty
# Db perf tests as discussed in the chat #! /usr/local/bin/tclsh8.6 set fn t.sqlite package require tdbc::sqlite3 namespace import tdbc::sqlite3::* proc q {qry {out {0}}} { db foreach -as dicts q $qry { if {$out} { puts [lindex $q end] } } } proc e {qry} { q "explain query plan $qry" yes } tdbc::sqlite3::connection create db $fn timerate -calibrate {q "select 1 from t limit 1;"} set qrys [dict create \ 1 {SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n LIMIT 20;} 2 {SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n LIMIT 200;} 3 {SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n LIMIT 2000;} 4 {SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n;}] dict for {n qry} $qrys { puts q:$qry puts -nonewline e: e $qry puts t:[timerate {q $qry}] puts "" } db close # EOF if 0 { q:SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n LIMIT 20; e:SEARCH t USING COVERING INDEX tvn (v=? AND n>?) USE TEMP B-TREE FOR ORDER BY t:344.686 µs/# 1796 # 2901.2 #/sec 619.056 net-ms q:SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n LIMIT 200; e:SEARCH t USING COVERING INDEX tvn (v=? AND n>?) USE TEMP B-TREE FOR ORDER BY t:3325.70 µs/# 283 # 300.69 #/sec 941.172 net-ms q:SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n LIMIT 2000; e:SEARCH t USING COVERING INDEX tvn (v=? AND n>?) USE TEMP B-TREE FOR ORDER BY t:33765.7 µs/# 30 # 29.616 #/sec 1012.971 net-ms q:SELECT n, v FROM t WHERE v IN ('A', 'Q') AND n >= 'NAESDCEJWEJUNWEQFJYLJAWMRQUKO' ORDER BY n; e:SEARCH t USING COVERING INDEX tvn (v=? AND n>?) USE TEMP B-TREE FOR ORDER BY t:183268.2 µs/# 6 # 5.456 #/sec 1099.609 net-ms }