Not necessarily.  Your table may be defined as:

create table x(a int, b int, c int, d int, ... y int, z int);
create index x_y on x (y);

in that case a select * from x where expression(y)

that scans the index (even without any skip-scan optimization) would be far 
more efficient than scanning the table, assuming that the where condition does 
not match all rows.

-- 
˙uʍop-ǝpısdn sı ɹoʇıuoɯ ɹnoʎ 'sıɥʇ pɐǝɹ uɐɔ noʎ ɟı

> -----Original Message-----
> From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org]
> On Behalf Of Marc L. Allen
> Sent: Friday, 14 July, 2017 14:50
> To: SQLite mailing list
> Subject: Re: [sqlite] 3.18.0 SELECT..WHERE x & ? != 0; doesn't use an
> index
> 
> Generally, but not always, WHERE elements using a column in an expression
> are unsuitable to using an index.
> 
> For instance:
> 
> WHERE y + 2 = 4 generally can't use an index, whereas WHERE y = 2 can.
> 
> That's not to say a smart optimizer won't convert the former to the
> latter.
> 
> But, what's the equivalent of y & 2 != 0?
> 
> That converts to y IN (0, 2, 4, ... MAX(y) & 2)
> 
> Ignoring the MAX(y), that's just a series of multiple indexed lookups and
> a table scan is almost certainly more efficient.
> 
> Marc
> 
> > On Jul 14, 2017, at 1:55 PM, Howard Kapustein
> <howard.kapust...@microsoft.com> wrote:
> >
> > sqlite> create table blah(id integer primary key not null, x text, y
> integer not null);
> > sqlite> create index blahindex on blah (y);
> > sqlite> explain query plan select * from blah where y & ? != 0;
> > 0|0|0|SCAN TABLE blah
> >
> > But other numeric expressions do e.g.
> >
> > sqlite> explain query plan select * from blah where y = ?;
> > 0|0|0|SEARCH TABLE blah USING INDEX blahindex (y=?)
> > sqlite> explain query plan select * from blah where y > ?;
> > 0|0|0|SEARCH TABLE blah USING INDEX blahindex (y>?)
> >
> > Is this a known issue?
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> 
> 
> Confidentiality notice: This e-mail is intended solely for use of the
> individual or entity to which it is addressed and may contain information
> that is proprietary, privileged, company confidential and/or exempt from
> disclosure under applicable law. If the reader is not the intended
> recipient or agent responsible for delivering the message to the intended
> recipient, you are hereby notified that any dissemination, distribution or
> copying of this communication is strictly prohibited. If you have received
> this communication in error, please notify the sender by reply e-mail or
> collect telephone call and delete or destroy all copies of this e-mail
> message, any physical copies made of this e-mail message and/or any file
> attachment(s).
> _______________________________________________
> 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