I have the folowing SQL code:
WITH
STAT_DATE(likeString) AS (
    -- Today
    -- SELECT CURRENT_DATE
    -- This month
    -- SELECT substr(CURRENT_DATE, 1, 8) || "%"
    -- This year
    -- SELECT substr(CURRENT_DATE, 1, 5) || "%"
    -- All data
    SELECT "%"
),
STAT_INFO(count, onePercent, likeString) AS (
    SELECT COUNT(*)
    ,      COUNT(*) / 100.0
    ,      likeString
    FROM   vmstat
    ,      STAT_DATE
    WHERE  date LIKE likeString
),
STAT_SLICES(Slice, Count, Percent) AS (
    SELECT ' 0 -  10', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >=  0 AND idletime <=  10
    UNION
    SELECT '11 -  20', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 11 AND idletime <=  20
    UNION
    SELECT '21 -  30', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 21 AND idletime <=  30
    UNION
    SELECT '31 -  40', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 31 AND idletime <=  40
    UNION
    SELECT '41 -  50', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 41 AND idletime <=  50
    UNION
    SELECT '51 -  60', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 51 AND idletime <=  60
    UNION
    SELECT '61 -  70', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 61 AND idletime <=  70
    UNION
    SELECT '71 -  80', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 71 AND idletime <=  80
    UNION
    SELECT '81 -  90', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 81 AND idletime <=  90
    UNION
    SELECT '91 - 100', COUNT(*), COUNT(*) / onePercent FROM vmstat,
STAT_INFO WHERE date LIKE likeString AND idletime >= 91 AND idletime <= 100
)
SELECT   Slice
,        ROUND(Percent, 2) AS Percentage
FROM     STAT_SLICES
WHERE    NOT Percentage IS NULL
ORDER BY Percentage DESC

The important part of the table is:
"0"    "vmstatID"    "INTEGER"    "0"    "NULL"    "1"
"1"    "date"    "TEXT"    "1"    "CURRENT_DATE"    "0"
"2"    "time"    "TEXT"    "1"    "CURRENT_TIME"    "0"
…
"18"    "idletime"    "INTEGER"    "1"    "NULL"    "0"

With this I can get the idle time of my computer easily for different
periods of time. There is only one small problem: it takes quit long to
execute, between 8 and 9 seconds. It is not a huge problem: how often do I
want to get this information? But I was wondering if I did something wrong
and if it could be optimised.
The table has just under 400.000 records.

I tried to change:
    idletime >=  0 AND idletime <=  10
to:
    idletime  BETWEEN 0 AND 10
but that seemed to take more time. (Between 10 to 100% more.)


I did the following measurements if that is any help.

The following takes about 900 ms
WITH
STAT_DATE(likeString) AS (
    -- Today
    -- SELECT CURRENT_DATE
    -- This month
    -- SELECT substr(CURRENT_DATE, 1, 8) || "%"
    -- This year
    -- SELECT substr(CURRENT_DATE, 1, 5) || "%"
    -- All data
    SELECT "%"
),
STAT_INFO(count, onePercent, likeString) AS (
    SELECT COUNT(*)
    ,      COUNT(*) / 100.0
    ,      likeString
    FROM   vmstat
    ,      STAT_DATE
    WHERE  date LIKE likeString
)
SELECT ' 0 -  10'
,      COUNT(*)
,      COUNT(*) / onePercent
FROM   vmstat
,      STAT_INFO
WHERE  date LIKE likeString
   AND idletime  BETWEEN 0 AND 10

When made simpler it takes about 500 ms
WITH
STAT_DATE(likeString) AS (
    -- Today
    -- SELECT CURRENT_DATE
    -- This month
    -- SELECT substr(CURRENT_DATE, 1, 8) || "%"
    -- This year
    -- SELECT substr(CURRENT_DATE, 1, 5) || "%"
    -- All data
    SELECT "%"
)
SELECT ' 0 -  10'
,      COUNT(*)
FROM   vmstat
,      STAT_DATE
WHERE  date LIKE likeString
   AND idletime  BETWEEN 0 AND 10

And the following takes about 300 ms:
SELECT ' 0 -  10'
,      COUNT(*)
FROM   vmstat
WHERE  idletime BETWEEN 0 AND 10

So probably when I write a program I could make it run in 3 seconds.


One other annoyance. I do this is the SQLite database browser. Every time I
execute this, my database is locked and I have to revert changes. What is
happening here.
By the way, this also happens when I execute:
    pragma table_info(vmstat)

-- 
Cecil Westerhof
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to