Hi,

Thanks for the helpful replies.


> Yes, good catch, I'll investigate. Looks like in the current implementation
> something is not quite right, when we have this order of columns in an index
> and where clause (e.g. in the examples above everything seems fine if we 
> create
> index over (feedcode, market) and not the other way around).

I did a little bit of investigation and it seems to occur because in pathkeys.c 
the function pathkey_is_redundant considers pathkeys redundant if there is an 
equality condition with a constant in the corresponding WHERE clause.

 * 1. If the new pathkey's equivalence class contains a constant, and isn't
 * below an outer join, then we can disregard it as a sort key.  An example:
 * SELECT ... WHERE x = 42 ORDER BY x, y;

In planner.c it builds the list of distinct_pathkeys, which is then used for 
the index skip scan to skip over the first length(distinct_pathkeys) columns 
when it does a skip. In my query, the distinct_pathkeys list only contains 
'feedcode' and not 'market', because 'market' was considered redundant due to 
the WHERE clause. However, the index skip scan interprets this as that it has 
to skip over just the first column.
We need to get this list of number of prefix columns to skip differently while 
building the plan. We need the 'real' number of distinct keys without throwing 
away the redundant ones. However, I'm not sure if this information can still be 
obtained while calling create_skipscan_unique_path? But I'm sure people here 
will have much better ideas than me about this :-)

-Floris

Reply via email to