Quick workaround: put a "+" on front of the first term of your ORDER BY
clause.

On Thursday, March 22, 2018, Jonathan Moules <jonathan-li...@lightpear.com>
wrote:
> Hi List,
>
> The below query takes just 0.002 seconds to run (sqlite 3.15.0 and 3.23.0
(preview)) despite looking through hundreds of thousands of records in each
table, and it returns 86 records in all. This is great!
>
> But when I stick an "ORDER BY" on the end (either ASC or DESC), the
processing time shoots up to 0.15s. The EXPLAIN between the two is
considerably different so it seems the ORDER BY is getting it to use a
sub-optimal query plan.
> If I put a LIMIT 1 on the end, the speed remains at 0.15s, but the query
plan is different again. The fast EXPLAIN and the ORDER BY/LIMIT EXPLAIN
are also here (they start changing at item 36).
>
> Any suggestions for what's going on here and how to coerce the planner to
stick to the fast-path and then do a simple order by on those 86 (or
however many - it'll always be a low number) results?
> (ANALYZE has been run)
>
> Thanks,
> Jonathan
>
>     SELECT
>         u.url_id, u.url, l.error_code
>     FROM
>         urls u
>     JOIN
>         lookups l
>         USING(url_id)
>     JOIN (
>         SELECT
>             url_id,
>             MAX(retrieval_datetime) AS retrieval_datetime
>         FROM lookups
>         WHERE
>             url_id IN (
>                 SELECT url_id FROM urls WHERE url = 'example.com'
>             )
>         ) recent
>
>         ON u.source_seed_id = recent.url_id
>             OR u.url_id = recent.url_id
>     WHERE
>         l.is_generic_flag = 1
>         AND
>         l.retrieval_datetime >= recent.retrieval_datetime
>         AND
>         DATETIME(recent.retrieval_datetime) > DATETIME('now', '-14 days',
'start of day')
>
>
> --------------------
> Fast EXPLAIN:
>
> 0    Init    0    63    0        00
> 1    Integer    35    1    0        00
> 2    Once    0    35    0        00
> 3    OpenEphemeral    2    2    0        00
> 4    Null    0    2    4        00
> 5    OpenRead    5    50315    0    k(4,-,,,)    02
> 6    Once    0    16    0        00
> 7    OpenEphemeral    7    1    0    k(1,B)    00
> 8    OpenRead    8    8    0    k(2,,)    02
> 9    String8    0    6    0    example.com    00
> 10    SeekGE    8    15    6    1    00
> 11    IdxGT    8    15    6    1    00
> 12    IdxRowid    8    7    0        00
> 13    MakeRecord    7    1    8    C    00
> 14    IdxInsert    7    8    0        00
> 15    Close    8    0    0        00
> 16    Rewind    7    28    0        00
> 17    Column    7    0    5        00
> 18    IsNull    5    27    0        00
> 19    SeekLE    5    27    5    1    00
> 20    IdxLT    5    27    5    1    00
> 21    Column    5    1    8        00
> 22    CollSeq    9    0    0    (BINARY)    00
> 23    AggStep0    0    8    3    max(1)    01
> 24    If    9    26    0        00
> 25    Column    5    0    2        00
> 26    Prev    5    20    0        00
> 27    NextIfOpen    7    17    0        00
> 28    Close    5    0    0        00
> 29    AggFinal    3    1    0    max(1)    00
> 30    SCopy    2    10    0        00
> 31    SCopy    3    11    0        00
> 32    MakeRecord    10    2    8        00
> 33    NewRowid    2    12    0        00
> 34    Insert    2    8    12        08
> 35    Return    1    0    0        00
> 36    OpenRead    1    9    0    8    00
> 37    OpenRead    0    7    0    5    00
> 38    Rewind    2    60    0        00
> 39    Column    2    1    14        00
> 40    Function0    0    14    13    datetime(-1)    01
> 41    Le    15    59    13        51
> 42    Rewind    1    59    0        00
> 43    Column    1    7    13        00
> 44    Ne    16    58    13    (BINARY)    53
> 45    Column    1    3    14        00
> 46    Column    2    1    17        00
> 47    Lt    17    58    14    (BINARY)    53
> 48    Column    1    1    18        00
> 49    SeekRowid    0    58    18        00
> 50    Column    0    4    19        00
> 51    Column    2    0    20        00
> 52    Eq    20    54    19    (BINARY)    43
> 53    Ne    20    58    18    (BINARY)    53
> 54    Copy    18    22    0        00
> 55    Column    0    1    23        00
> 56    Column    1    6    24        00
> 57    ResultRow    22    3    0        00
> 58    Next    1    43    0        01
> 59    Next    2    39    0        01
> 60    Close    1    0    0        00
> 61    Close    0    0    0        00
> 62    Halt    0    0    0        00
> 63    Transaction    0    0    496    0    01
> 64    TableLock    0    9    0    lookups    00
> 65    TableLock    0    7    0    urls    00
> 66    String8    0    25    0    now    00
> 67    String8    0    26    0    -14 days    00
> 68    String8    0    27    0    start of day    00
> 69    Function0    7    25    15    datetime(-1)    03
> 70    Integer    1    16    0        00
> 71    Goto    0    1    0        00
>
>
> -------
> ORDER BY and LIMIT Explain:
> 0    Init    0    77    0        00
> 1    Integer    35    1    0        00
> 2    Once    0    35    0        00
> 3    OpenEphemeral    2    2    0        00
> 4    Null    0    2    4        00
> 5    OpenRead    5    50315    0    k(4,-,,,)    02
> 6    Once    0    16    0        00
> 7    OpenEphemeral    7    1    0    k(1,B)    00
> 8    OpenRead    8    8    0    k(2,,)    02
> 9    String8    0    6    0    example.com    00
> 10    SeekGE    8    15    6    1    00
> 11    IdxGT    8    15    6    1    00
> 12    IdxRowid    8    7    0        00
> 13    MakeRecord    7    1    8    C    00
> 14    IdxInsert    7    8    0        00
> 15    Close    8    0    0        00
> 16    Rewind    7    28    0        00
> 17    Column    7    0    5        00
> 18    IsNull    5    27    0        00
> 19    SeekLE    5    27    5    1    00
> 20    IdxLT    5    27    5    1    00
> 21    Column    5    1    8        00
> 22    CollSeq    9    0    0    (BINARY)    00
> 23    AggStep0    0    8    3    max(1)    01
> 24    If    9    26    0        00
> 25    Column    5    0    2        00
> 26    Prev    5    20    0        00
> 27    NextIfOpen    7    17    0        00
> 28    Close    5    0    0        00
> 29    AggFinal    3    1    0    max(1)    00
> 30    SCopy    2    10    0        00
> 31    SCopy    3    11    0        00
> 32    MakeRecord    10    2    8        00
> 33    NewRowid    2    12    0        00
> 34    Insert    2    8    12        08
> 35    Return    1    0    0        00
> 36    OpenEphemeral    9    5    0    k(1,B)    00
> 37    Integer    1    13    0        00
> 38    OpenRead    1    9    0    8    00
> 39    OpenRead    0    7    0    5    00
> 40    Rewind    2    68    0        00
> 41    Column    2    1    15        00
> 42    Function0    0    15    14    datetime(-1)    01
> 43    Le    16    67    14        51
> 44    Rewind    1    67    0        00
> 45    Column    1    7    14        00
> 46    Ne    17    66    14    (BINARY)    53
> 47    Column    1    3    15        00
> 48    Column    2    1    18        00
> 49    Lt    18    66    15    (BINARY)    53
> 50    Column    1    1    19        00
> 51    SeekRowid    0    66    19        00
> 52    Column    0    4    20        00
> 53    Column    2    0    21        00
> 54    Eq    21    56    20    (BINARY)    43
> 55    Ne    21    66    19    (BINARY)    53
> 56    Copy    19    25    0        00
> 57    Column    0    1    26        00
> 58    Column    1    6    27        00
> 59    Copy    25    23    0        00
> 60    Sequence    9    24    0        00
> 61    MakeRecord    23    5    28        00
> 62    IdxInsert    9    28    0        00
> 63    IfNotZero    13    66    1        00
> 64    Last    9    0    0        00
> 65    Delete    9    0    0        00
> 66    Next    1    45    0        01
> 67    Next    2    41    0        01
> 68    Close    1    0    0        00
> 69    Close    0    0    0        00
> 70    Sort    9    76    0        00
> 71    Column    9    2    25        00
> 72    Column    9    3    26        00
> 73    Column    9    4    27        00
> 74    ResultRow    25    3    0        00
> 75    Next    9    71    0        00
> 76    Halt    0    0    0        00
> 77    Transaction    0    0    496    0    01
> 78    TableLock    0    9    0    lookups    00
> 79    TableLock    0    7    0    urls    00
> 80    String8    0    29    0    now    00
> 81    String8    0    30    0    -14 days    00
> 82    String8    0    31    0    start of day    00
> 83    Function0    7    29    16    datetime(-1)    03
> 84    Integer    1    17    0        00
> 85    Goto    0    1    0        00
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>

-- 
D. Richard Hipp
d...@sqlite.org
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to