Is P.id an integer primary key? If so then it can get it from any index. Since 
the only field it needs from P is id, it can use an index which isn't defined 
on id. This can make it quicker, especially if P has a lot of fields bloating 
its size. Once you include the other fields of P in the query then it has to go 
to the main table anyway to get those other fields and decides to do a full 
scan.


-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On 
Behalf Of John Found
Sent: Monday, February 05, 2018 9:14 AM
To: SQLite mailing list
Subject: [sqlite] Optimization - don't understand.

The following query:

    explain query plan
    select 
      U.nick,
      U.id,
      U.av_time,
      T.Caption,
      P.id,
    --  P.ReadCount,
    --  P.Content,
    --  P.postTime,l
      T.Caption
    from Posts P
    left join Threads T on P.threadID = T.id
    left join ThreadTags TT on TT.threadID = T.id
    left join Users U on P.userID = U.id
    where TT.Tag = ?1;

...returns:

    0 0 0 SCAN TABLE Posts AS P USING COVERING INDEX idxPostsThreadUser
    0 1 1 SEARCH TABLE Threads AS T USING INTEGER PRIMARY KEY (rowid=?)
    0 2 2 SEARCH TABLE ThreadTags AS TT USING COVERING INDEX 
idxThreadTagsUnique (ThreadID=? AND Tag=?)
    0 3 3 SEARCH TABLE Users AS U USING INTEGER PRIMARY KEY (rowid=?)

But uncommenting any of the commented fields, turns the result into:

    0 0 0 SCAN TABLE Posts AS P
    0 1 1 SEARCH TABLE Threads AS T USING INTEGER PRIMARY KEY (rowid=?)
    0 2 2 SEARCH TABLE ThreadTags AS TT USING COVERING INDEX 
idxThreadTagsUnique (ThreadID=? AND Tag=?)
    0 3 3 SEARCH TABLE Users AS U USING INTEGER PRIMARY KEY (rowid=?)

... and significantly degrades the performance.

The index idxPostsThreadUser is defined following way:

    create index idxPostsThreadUser on Posts(threadid, userid);

IMHO, the change of the selected columns should not affect the query plan, but 
maybe I am wrong somehow.

What I am missing?

-- 
http://fresh.flatassembler.net
http://asm32.info
John Found <johnfo...@asm32.info>
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to