Le 20.10.2010 16:44, Pavel Ivanov a écrit : >> It seems legitimate to use the idx_foobar because it is already >> sorted.. no? > > Yes, it is sorted. So for example you have 2 values and you need to > put them in order. You know that these values exist somewhere in the > index in exact order you need. How would you find the order? You'll > need to scan the whole index to find values you have (you don't know > where exactly they are in the index) and then you'll know what order > they have. And you have to repeat this index scan for each value you > have. Do you think it would be faster than just calling your > comparison function?
Yes, okay... I was imagining an index like this: /* for one data in a table */ struct data { void *value; ... const struct idx *idx; /* ptr on the entry in 'idx_foobar' */ } *my_data_in_the_table /* for an index */ struct idx { struct idx *next; struct idx *prev; ... const void *data; /* ptr on 'my_data_in_the_table' */ } *idx_foobar To fix my problem then I must create my own high level index ... Thanks everyone! Mathieu > > > Pavel > > On Wed, Oct 20, 2010 at 10:30 AM, Mathieu Schroeter > <schroe...@epsitec.ch> wrote: >> Le 20.10.2010 15:51, Drake Wilson a écrit : >>> Quoth Mathieu Schroeter<schroe...@epsitec.ch>, on 2010-10-20 15:41:51 +0200: >>>> Thanks for your interesting answer. >>>> >>>> The first plan looks the best but it does not explain the ORDER BY. >>>> If I could done this job with pencil and paper, my way will be: >>>> >>>> a) enumerate all entries in lol >>>> b) for each entry look up a corresponding row in tmp using its >>>> primary key >>>> c) the loop over lol is complete, I see that tmp.data uses >>>> `COLLATE foobar` then I look if an index exists. >>>> d) Yes then I use idx_foobar instead of many calls on the >>>> comparison function. >>> >>> In step (d), you're doing what? Sorting the resulting rows? How >>> exactly would you use the index for that? >>> >> >> Well, I don't know how are implemented the indexes. I know only >> that the index (idx_foobar) is ordered and this one is populated >> at the same time that the INSERT. >> >> CREATE INDEX idx_foobar ON tmp (data COLLATE foobar); >> >> INSERT INTO tmp (data) values (CAST(x'0100' AS TEXT)); >> INSERT INTO tmp (data) values (CAST(x'0400' AS TEXT)); >> ... >> >> and CAST() is used because I have a BLOB in my table... >> >> >> I would like to save time for this query (no index for lol.id): >> >> SELECT data >> FROM lol INNER JOIN tmp >> ON lol.id = tmp.id >> ORDER BY tmp.data COLLATE foobar; >> >> >> Now each row in the result are using the comparison function provided >> by foobar. But the comparisons were already done when the data were >> inserted in the table?!? >> >> It seems legitimate to use the idx_foobar because it is already >> sorted.. no? >> >> >> Maybe I've not understood what is an index. >> >> >> Mathieu >> >> >> _______________________________________________ >> sqlite-users mailing list >> sqlite-users@sqlite.org >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >> > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users