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
}