"=?ISO-8859-1?Q?P=E9ter_Szab=F3?=" <[EMAIL PROTECTED]> wrote:
> 
> My schema is the following:
> 
>   CREATE TABLE t (
>     col1 text NOT NULL,
>     col2 integer NOT NULL,
>     col3 integer NOT NULL,
>     col4 text NOT NULL,
>     col5 text NOT NULL,
>     PRIMARY KEY(col1, col2, col3, col4, col5),
>     UNIQUE(col1, col4, col5),
>     UNIQUE(col4, col5, col1),
>     UNIQUE(col5, col4, col1),
>   );
> 
> 
> This is also instant, possibly because SQLite is using UNIQUE(col1,col4,col=
> 5):
> 
>   SELECT col5 FROM t WHERE col1='foobar' AND
>     col4='foobarfoobarfoobarfoob';
> 
> However, this is very slow in SQLite 3.3.5:
> 
>   SELECT col2 FROM t WHERE col1='foobar' AND
>     col4='foobarfoobarfoobarfoob';
> 

The second one will be much faster if you add the "col2" column
to the end of your first UNIQUE constraint:

   UNIQUE(col1, col4, col5, col2),

Each UNIQUE constraint creates an index.  In the case
where you have only the first 3 columns in the index,
the first 2 columns are used to lookup the rowid of
the table, then a binary search is performed for each
row of the table.  If there are N rows in the entire
database and K rows of result, then this query requires
time O(KlogN).  But if col2 is already part of the
index entry, there is no need to perform that binary
search and the value of col2 is extracted directly from
the index itself.  This results in O(K + logN) run time,
which can be much faster, especially if the database
file is not in your disk cache.
--
D. Richard Hipp   <[EMAIL PROTECTED]>

Reply via email to