[sqlite] Is it possible to have query planner use FTS Index for ORDER BY

2015-08-20 Thread Vladimir Vissoultchev
Actually, doubt it's possible to use `content1_index` for ordering in your
case once `content` rows are filtered by the IN operator. Most probably the
index is just ignored here.

Do you get any measurable performance improvement with vs w/o it?

cheers,


-Original Message-
From: sqlite-users-boun...@mailinglists.sqlite.org
[mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of David
Waters
Sent: Thursday, August 20, 2015 8:58 PM
To: General Discussion of SQLite Database
Subject: Re: [sqlite] Is it possible to have query planner use FTS Index for
ORDER BY

Thanks Dan and Vladimir.  A combination of the two approaches is required.
I'll detail it here for future reference:

Using the sub query against the FTS table as suggested:

SELECT * FROM main
WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data') ORDER BY
udate

Still causes the USE TEMP B-TREE FOR ORDER BY.  As Dan pointed out, the FTS
"index" isn't a traditional SQL Index.  However, by using the suggested
content table to populate the FTS table, I was able to get the desired
result, with just a few more steps (and disk space) required:

CREATE TABLE IF NOT EXISTS content1 (id INTEGER PRIMARY KEY, udate, msg)
CREATE VIRTUAL TABLE IF NOT EXISTS main USING
fts4(content="content1",id,udate,msg)
CREATE TRIGGER IF NOT EXISTS content_trig1 AFTER INSERT ON content1 BEGIN
INSERT INTO main(docid,udate,msg) VALUES(new.rowid, new.udate,new.msg); END
CREATE INDEX IF NOT EXISTS content1_index on content1 (udate)

To query with ORDER BY, I had to also add the "INDEXED BY" to get the Query
Planner to use the Index, and not a temp B-tree.

SELECT * FROM content1 INDEXED BY content1_index WHERE rowid IN (SELECT
rowid FROM main WHERE main MATCH 'data to match') ORDER BY odate"

And I now have fast (and sorted) FTS queries again, with no temp B-tree!

Thanks.

Dave



On Thu, Aug 20, 2015 at 11:23 AM, Vladimir Vissoultchev 
wrote:

> Try to rewrite the query like this
>
> SELECT * FROM main
> WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data') ORDER 
> BY udate
>
> cheers,
> 
>
> -Original Message-
> From: sqlite-users-bounces at mailinglists.sqlite.org
> [mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of 
> David Waters
> Sent: Thursday, August 20, 2015 4:47 PM
> To: General Discussion of SQLite Database
> Subject: Re: [sqlite] Is it possible to have query planner use FTS 
> Index for ORDER BY
>
> Sorry.  I should have specified that that 'udate' is one of the 
> indexed columns of the FTS4 table main.
>
> The goal is to do a FTS query and be able to ensure the results are 
> ordered the same each time (via the ORDER BY).  It seemed at first to 
> me that the FTS index contains what is needed for the ORDER BY, but 
> that is likely incorrect.
>
> Thanks.
>
> DW
>
> On Thursday, August 20, 2015, Dan Kennedy  wrote:
>
> > On 08/20/2015 12:38 PM, David Waters wrote:
> >
> >> I have a large FTS4 table (around 200 million rows and growing).  A 
> >> simple query (SELECT * FROM main WHERE main MATCH 'data') returns 
> >> in less than a second.  However, if an ORDER BY is added (SELECT * 
> >> FROM main WHERE main MATCH 'data' ORDER BY udate) it will never 
> >> return (after 20 mins, I canceled the query).
> >>
> >> EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE 
> >> FOR ORDER BY'.  Shouldn't it attempt to use the available FTS Index 
> >> for ORDER BY?
> >>
> >
> > I don't see how it could. The FTS index is not a list of rows sorted 
> > by udate.
> >
> > If not, Is there another method (or work around) to get the data 
> > back
> >> in order?
> >>
> >
> > You could use an external content FTS index. Then put a regular 
> > index on the udate column of your external content table and query 
> > it directly for non-fulltext queries.
> >
> >   https://www.sqlite.org/fts3.html#section_6_2_2
> >
> > Dan.
> >
> > ___
> > sqlite-users mailing list
> > sqlite-users at mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
>
>
> --
> Dave
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>



--
Dave
___
sqlite-users mailing list
sqlite-users at mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



[sqlite] Is it possible to have query planner use FTS Index for ORDER BY

2015-08-20 Thread Vladimir Vissoultchev
Try to rewrite the query like this

SELECT * FROM main
WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data') 
ORDER BY udate

cheers,


-Original Message-
From: sqlite-users-boun...@mailinglists.sqlite.org
[mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of David
Waters
Sent: Thursday, August 20, 2015 4:47 PM
To: General Discussion of SQLite Database
Subject: Re: [sqlite] Is it possible to have query planner use FTS Index for
ORDER BY

Sorry.  I should have specified that that 'udate' is one of the indexed
columns of the FTS4 table main.

The goal is to do a FTS query and be able to ensure the results are ordered
the same each time (via the ORDER BY).  It seemed at first to me that the
FTS index contains what is needed for the ORDER BY, but that is likely
incorrect.

Thanks.

DW

On Thursday, August 20, 2015, Dan Kennedy  wrote:

> On 08/20/2015 12:38 PM, David Waters wrote:
>
>> I have a large FTS4 table (around 200 million rows and growing).  A 
>> simple query (SELECT * FROM main WHERE main MATCH 'data') returns in 
>> less than a second.  However, if an ORDER BY is added (SELECT * FROM 
>> main WHERE main MATCH 'data' ORDER BY udate) it will never return 
>> (after 20 mins, I canceled the query).
>>
>> EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE 
>> FOR ORDER BY'.  Shouldn't it attempt to use the available FTS Index 
>> for ORDER BY?
>>
>
> I don't see how it could. The FTS index is not a list of rows sorted 
> by udate.
>
> If not, Is there another method (or work around) to get the data back
>> in order?
>>
>
> You could use an external content FTS index. Then put a regular index 
> on the udate column of your external content table and query it 
> directly for non-fulltext queries.
>
>   https://www.sqlite.org/fts3.html#section_6_2_2
>
> Dan.
>
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>


--
Dave
___
sqlite-users mailing list
sqlite-users at mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



[sqlite] Is it possible to have query planner use FTS Index for ORDER BY

2015-08-20 Thread Dan Kennedy
On 08/20/2015 12:38 PM, David Waters wrote:
> I have a large FTS4 table (around 200 million rows and growing).  A simple
> query (SELECT * FROM main WHERE main MATCH 'data') returns in less than a
> second.  However, if an ORDER BY is added (SELECT * FROM main WHERE main
> MATCH 'data' ORDER BY udate) it will never return (after 20 mins, I
> canceled the query).
>
> EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE FOR
> ORDER BY'.  Shouldn't it attempt to use the available FTS Index for ORDER
> BY?

I don't see how it could. The FTS index is not a list of rows sorted by 
udate.

> If not, Is there another method (or work around) to get the data back
> in order?

You could use an external content FTS index. Then put a regular index on 
the udate column of your external content table and query it directly 
for non-fulltext queries.

   https://www.sqlite.org/fts3.html#section_6_2_2

Dan.



[sqlite] Is it possible to have query planner use FTS Index for ORDER BY

2015-08-20 Thread David Waters
I did.  My last post was based off testing it live - it works beautifully.
Lighting quick and sorted without a temp B-TREE:

EXPLAIN QUERY PLAN is now:

SCAN TABLE content1 USING INDEX content1_index (~10 rows)
EXECUTE LIST SUBQUERY 1
SCAN TABLE main VIRTUAL TABLE INDEX 6: (~0 rows)

Dave


On Thu, Aug 20, 2015 at 2:36 PM, Vladimir Vissoultchev 
wrote:

> Actually, doubt it's possible to use `content1_index` for ordering in your
> case once `content` rows are filtered by the IN operator. Most probably the
> index is just ignored here.
>
> Do you get any measurable performance improvement with vs w/o it?
>
> cheers,
> 
>
> -Original Message-
> From: sqlite-users-bounces at mailinglists.sqlite.org
> [mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of David
> Waters
> Sent: Thursday, August 20, 2015 8:58 PM
> To: General Discussion of SQLite Database
> Subject: Re: [sqlite] Is it possible to have query planner use FTS Index
> for
> ORDER BY
>
> Thanks Dan and Vladimir.  A combination of the two approaches is required.
> I'll detail it here for future reference:
>
> Using the sub query against the FTS table as suggested:
>
> SELECT * FROM main
> WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data') ORDER BY
> udate
>
> Still causes the USE TEMP B-TREE FOR ORDER BY.  As Dan pointed out, the FTS
> "index" isn't a traditional SQL Index.  However, by using the suggested
> content table to populate the FTS table, I was able to get the desired
> result, with just a few more steps (and disk space) required:
>
> CREATE TABLE IF NOT EXISTS content1 (id INTEGER PRIMARY KEY, udate, msg)
> CREATE VIRTUAL TABLE IF NOT EXISTS main USING
> fts4(content="content1",id,udate,msg)
> CREATE TRIGGER IF NOT EXISTS content_trig1 AFTER INSERT ON content1 BEGIN
> INSERT INTO main(docid,udate,msg) VALUES(new.rowid, new.udate,new.msg); END
> CREATE INDEX IF NOT EXISTS content1_index on content1 (udate)
>
> To query with ORDER BY, I had to also add the "INDEXED BY" to get the Query
> Planner to use the Index, and not a temp B-tree.
>
> SELECT * FROM content1 INDEXED BY content1_index WHERE rowid IN (SELECT
> rowid FROM main WHERE main MATCH 'data to match') ORDER BY odate"
>
> And I now have fast (and sorted) FTS queries again, with no temp B-tree!
>
> Thanks.
>
> Dave
>
>
>
> On Thu, Aug 20, 2015 at 11:23 AM, Vladimir Vissoultchev 
> wrote:
>
> > Try to rewrite the query like this
> >
> > SELECT * FROM main
> > WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data') ORDER
> > BY udate
> >
> > cheers,
> > 
> >
> > -Original Message-
> > From: sqlite-users-bounces at mailinglists.sqlite.org
> > [mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of
> > David Waters
> > Sent: Thursday, August 20, 2015 4:47 PM
> > To: General Discussion of SQLite Database
> > Subject: Re: [sqlite] Is it possible to have query planner use FTS
> > Index for ORDER BY
> >
> > Sorry.  I should have specified that that 'udate' is one of the
> > indexed columns of the FTS4 table main.
> >
> > The goal is to do a FTS query and be able to ensure the results are
> > ordered the same each time (via the ORDER BY).  It seemed at first to
> > me that the FTS index contains what is needed for the ORDER BY, but
> > that is likely incorrect.
> >
> > Thanks.
> >
> > DW
> >
> > On Thursday, August 20, 2015, Dan Kennedy  wrote:
> >
> > > On 08/20/2015 12:38 PM, David Waters wrote:
> > >
> > >> I have a large FTS4 table (around 200 million rows and growing).  A
> > >> simple query (SELECT * FROM main WHERE main MATCH 'data') returns
> > >> in less than a second.  However, if an ORDER BY is added (SELECT *
> > >> FROM main WHERE main MATCH 'data' ORDER BY udate) it will never
> > >> return (after 20 mins, I canceled the query).
> > >>
> > >> EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE
> > >> FOR ORDER BY'.  Shouldn't it attempt to use the available FTS Index
> > >> for ORDER BY?
> > >>
> > >
> > > I don't see how it could. The FTS index is not a list of rows sorted
> > > by udate.
> > >
> > > If not, Is there another method (or work around) to get the data
> > > back
> > >> in order?
> > >>
> > >
> > > You could use an external content FTS index. Then put a regular
> > > index on the udate column of your external content table and query
> > > it directly for non-fulltext queries.
> > >
> > >   https://www.sqlite.org/fts3.html#section_6_2_2
> > >
> > > Dan.
> > >
> > > ___
> > > sqlite-users mailing list
> > > sqlite-users at mailinglists.sqlite.org
> > > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> > >
> >
> >
> > --
> > Dave
> > ___
> > sqlite-users mailing list
> > sqlite-users at mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> > ___
> > sqlite-users mailing list
> > 

[sqlite] Is it possible to have query planner use FTS Index for ORDER BY

2015-08-20 Thread David Waters
Thanks Dan and Vladimir.  A combination of the two approaches is required.
I'll detail it here for future reference:

Using the sub query against the FTS table as suggested:

SELECT * FROM main
WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data')
ORDER BY udate

Still causes the USE TEMP B-TREE FOR ORDER BY.  As Dan pointed out, the FTS
"index" isn't a traditional SQL Index.  However, by using the suggested
content table to populate the FTS table, I was able to get the desired
result, with just a few more steps (and disk space) required:

CREATE TABLE IF NOT EXISTS content1 (id INTEGER PRIMARY KEY, udate, msg)
CREATE VIRTUAL TABLE IF NOT EXISTS main USING
fts4(content="content1",id,udate,msg)
CREATE TRIGGER IF NOT EXISTS content_trig1 AFTER INSERT ON content1 BEGIN
INSERT INTO main(docid,udate,msg) VALUES(new.rowid, new.udate,new.msg); END
CREATE INDEX IF NOT EXISTS content1_index on content1 (udate)

To query with ORDER BY, I had to also add the "INDEXED BY" to get the Query
Planner to use the Index, and not a temp B-tree.

SELECT * FROM content1 INDEXED BY content1_index WHERE rowid IN (SELECT
rowid FROM main WHERE main MATCH 'data to match') ORDER BY odate"

And I now have fast (and sorted) FTS queries again, with no temp B-tree!

Thanks.

Dave



On Thu, Aug 20, 2015 at 11:23 AM, Vladimir Vissoultchev 
wrote:

> Try to rewrite the query like this
>
> SELECT * FROM main
> WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data')
> ORDER BY udate
>
> cheers,
> 
>
> -Original Message-
> From: sqlite-users-bounces at mailinglists.sqlite.org
> [mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of David
> Waters
> Sent: Thursday, August 20, 2015 4:47 PM
> To: General Discussion of SQLite Database
> Subject: Re: [sqlite] Is it possible to have query planner use FTS Index
> for
> ORDER BY
>
> Sorry.  I should have specified that that 'udate' is one of the indexed
> columns of the FTS4 table main.
>
> The goal is to do a FTS query and be able to ensure the results are ordered
> the same each time (via the ORDER BY).  It seemed at first to me that the
> FTS index contains what is needed for the ORDER BY, but that is likely
> incorrect.
>
> Thanks.
>
> DW
>
> On Thursday, August 20, 2015, Dan Kennedy  wrote:
>
> > On 08/20/2015 12:38 PM, David Waters wrote:
> >
> >> I have a large FTS4 table (around 200 million rows and growing).  A
> >> simple query (SELECT * FROM main WHERE main MATCH 'data') returns in
> >> less than a second.  However, if an ORDER BY is added (SELECT * FROM
> >> main WHERE main MATCH 'data' ORDER BY udate) it will never return
> >> (after 20 mins, I canceled the query).
> >>
> >> EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE
> >> FOR ORDER BY'.  Shouldn't it attempt to use the available FTS Index
> >> for ORDER BY?
> >>
> >
> > I don't see how it could. The FTS index is not a list of rows sorted
> > by udate.
> >
> > If not, Is there another method (or work around) to get the data back
> >> in order?
> >>
> >
> > You could use an external content FTS index. Then put a regular index
> > on the udate column of your external content table and query it
> > directly for non-fulltext queries.
> >
> >   https://www.sqlite.org/fts3.html#section_6_2_2
> >
> > Dan.
> >
> > ___
> > sqlite-users mailing list
> > sqlite-users at mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
>
>
> --
> Dave
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
Dave


[sqlite] Is it possible to have query planner use FTS Index for ORDER BY

2015-08-20 Thread David Waters
Sorry.  I should have specified that that 'udate' is one of the indexed
columns of the FTS4 table main.

The goal is to do a FTS query and be able to ensure the results are ordered
the same each time (via the ORDER BY).  It seemed at first to me that the
FTS index contains what is needed for the ORDER BY, but that is likely
incorrect.

Thanks.

DW

On Thursday, August 20, 2015, Dan Kennedy  wrote:

> On 08/20/2015 12:38 PM, David Waters wrote:
>
>> I have a large FTS4 table (around 200 million rows and growing).  A simple
>> query (SELECT * FROM main WHERE main MATCH 'data') returns in less than a
>> second.  However, if an ORDER BY is added (SELECT * FROM main WHERE main
>> MATCH 'data' ORDER BY udate) it will never return (after 20 mins, I
>> canceled the query).
>>
>> EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE FOR
>> ORDER BY'.  Shouldn't it attempt to use the available FTS Index for ORDER
>> BY?
>>
>
> I don't see how it could. The FTS index is not a list of rows sorted by
> udate.
>
> If not, Is there another method (or work around) to get the data back
>> in order?
>>
>
> You could use an external content FTS index. Then put a regular index on
> the udate column of your external content table and query it directly for
> non-fulltext queries.
>
>   https://www.sqlite.org/fts3.html#section_6_2_2
>
> Dan.
>
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>


-- 
Dave


[sqlite] Is it possible to have query planner use FTS Index for ORDER BY

2015-08-20 Thread David Waters
I have a large FTS4 table (around 200 million rows and growing).  A simple
query (SELECT * FROM main WHERE main MATCH 'data') returns in less than a
second.  However, if an ORDER BY is added (SELECT * FROM main WHERE main
MATCH 'data' ORDER BY udate) it will never return (after 20 mins, I
canceled the query).

EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE FOR
ORDER BY'.  Shouldn't it attempt to use the available FTS Index for ORDER
BY?  If not, Is there another method (or work around) to get the data back
in order?

Thank you.

Dave