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
> <[email protected]> wrote:
>> Le 20.10.2010 15:51, Drake Wilson a écrit :
>>> Quoth Mathieu Schroeter<[email protected]>, 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
>> [email protected]
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users