Currently, the planner spends a good deal of time pushing around lists
of small integers, because it uses such lists to identify join
relations.  For example, given SELECT ... FROM a, b, c WHERE ...
the list (1,2) (or equivalently (2,1)) would represent the join of
a and b.

This representation is pretty clearly a hangover from the days when the
Postgres planner was written in Lisp :-(.  It's inefficient --- common
operations like union, intersection, and is-subset tests require O(N^2)
steps.  And it's error-prone: I just had my nose rubbed once again in
the nasty things that happen if you accidentally get some duplicate
entries in a relation ID list.  (It's nasty because some but not all of
the low-level list-as-set operations depend on the assumption that the
elements of a given list are distinct.)

I'm thinking of replacing this representation by a
variable-length-bitmap representation.  Basically it would be like

        struct bitmapset {
                int nwords;        /* number of words in array */
                int array[1];      /* really [nwords] */

Each array element would hold 32 bits; the integer i is a member of
the set iff (array[i/32] >> (i%32)) & 1 == 1.  For sets containing no
elements over 31 (which would account for the vast majority of queries)
only a single word would be needed in the array.  Operations like set
union, intersection, and subset test could process 32 bits at a time ---
they'd reduce to trivial C operations like |=, &=, & ~, applied once per
word.  There would be a few things that would be slower (like iterating
through the actual integer elements of a set) but AFAICT this
representation is much better suited to the planner's needs than the
list method.

I've been thinking of doing this for a while just on efficiency grounds,
but kept putting it off because I don't expect much of any performance
gain on simple queries.  (You need a dozen or so tables in a query
before the inefficiencies of the list representation really start to
hurt.)  But tonight I'm thinking I'll do it anyway, because it'll also
be impervious to duplicate-element bugs.


                        regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to