2017-02-15 12:02 GMT+01:00 R Smith <rsm...@rsweb.co.za>:

> Note however that this may not be entirely true. The Query might read data
> from the disk cache (or several memory caches may be in play) during the
> second run. Run each statement many times, and compare average return times.
>
> Also try this:
> ... WHERE totaltime NOT BETWEEN 99 AND 101;
> or
> ... WHERE NOT (totaltime BETWEEN 99 AND 101);
>

​I wrote the following Bash script:
#!/usr/bin/env bash

set -o errexit
set -o nounset


declare -r COUNT=10
declare -r SELECT='
SELECT date
,      time
,      usertime
,      systemtime
,      idletime
,      waittime
,      stolentime
,      (usertime + systemtime + idletime + waittime + stolentime) AS
totaltime
FROM   vmstat
'

declare -r ABS_VERSION="
${SELECT}
WHERE  ABS(100 - totaltime) > 1
;"
declare -r OR_VERSION="
${SELECT}
WHERE  totaltime  < 99 OR totaltime > 101
;"
declare -r NOT_BETWEEN_VERSION="
${SELECT}
WHERE totaltime NOT BETWEEN 99 AND 101
;"
declare -r NOT_BETWEEN_VERSION2="
${SELECT}
WHERE NOT (totaltime BETWEEN 99 AND 101)
;"


function timeQuery {
    for i in $(seq ${COUNT}) ; do
        sqlite3 ~/Databases/general.sqlite <<EOT
.timer on
.output /dev/null
${1}
EOT
    done
}


printf "Timing OR version\n"
timeQuery "${OR_VERSION}"
printf "\n\n\nTiming ABS version\n"
timeQuery "${ABS_VERSION}"
printf "\n\n\nTiming NOT BETWEEN version\n"
timeQuery "${NOT_BETWEEN_VERSION}"
printf "\n\n\nTiming NOT BETWEEN version 2\n"
timeQuery "${NOT_BETWEEN_VERSION2}"


This gives:
Timing OR version
Run Time: real 0.301 user 0.260000 sys 0.040000
Run Time: real 0.301 user 0.260000 sys 0.040000
Run Time: real 0.295 user 0.268000 sys 0.028000
Run Time: real 0.282 user 0.252000 sys 0.032000
Run Time: real 0.287 user 0.276000 sys 0.012000
Run Time: real 0.278 user 0.240000 sys 0.040000
Run Time: real 0.288 user 0.276000 sys 0.012000
Run Time: real 0.290 user 0.260000 sys 0.028000
Run Time: real 0.285 user 0.244000 sys 0.040000
Run Time: real 0.303 user 0.292000 sys 0.012000



Timing ABS version
Run Time: real 0.256 user 0.224000 sys 0.032000
Run Time: real 0.260 user 0.236000 sys 0.024000
Run Time: real 0.256 user 0.228000 sys 0.028000
Run Time: real 0.259 user 0.240000 sys 0.020000
Run Time: real 0.262 user 0.236000 sys 0.024000
Run Time: real 0.262 user 0.236000 sys 0.024000
Run Time: real 0.260 user 0.220000 sys 0.040000
Run Time: real 0.251 user 0.224000 sys 0.028000
Run Time: real 0.252 user 0.224000 sys 0.028000
Run Time: real 0.257 user 0.224000 sys 0.032000



Timing NOT BETWEEN version
Run Time: real 0.252 user 0.236000 sys 0.016000
Run Time: real 0.242 user 0.216000 sys 0.024000
Run Time: real 0.250 user 0.228000 sys 0.020000
Run Time: real 0.245 user 0.216000 sys 0.028000
Run Time: real 0.240 user 0.196000 sys 0.044000
Run Time: real 0.258 user 0.232000 sys 0.024000
Run Time: real 0.284 user 0.248000 sys 0.036000
Run Time: real 0.253 user 0.228000 sys 0.024000
Run Time: real 0.249 user 0.216000 sys 0.032000
Run Time: real 0.246 user 0.208000 sys 0.036000



Timing NOT BETWEEN version 2
Run Time: real 0.257 user 0.228000 sys 0.028000
Run Time: real 0.264 user 0.240000 sys 0.024000
Run Time: real 0.254 user 0.232000 sys 0.020000
Run Time: real 0.257 user 0.204000 sys 0.052000
Run Time: real 0.248 user 0.212000 sys 0.036000
Run Time: real 0.257 user 0.228000 sys 0.028000
Run Time: real 0.246 user 0.232000 sys 0.012000
Run Time: real 0.245 user 0.228000 sys 0.016000
Run Time: real 0.278 user 0.260000 sys 0.016000
Run Time: real 0.275 user 0.252000 sys 0.024000


So I would say that the OR version is less efficient as the other three.
And that there is not a big difference between those.

-- 
Cecil Westerhof
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to