[postgis-users] multi-column index w/ btree & gist

Paul Ramsey pramsey at refractions.net
Fri Sep 26 07:46:39 PDT 2003


Two things you can do (a) enable the stats engine and have two separate 
indexes. With stats enabled, the planner will make better decisions 
about which index to use, and what times. (b) try a multikey index. You 
can do multikey GiST indexes, but all elements of the index must be 
GiST. That is where things get trickier. Most data types are bound to 
btree, not gist. So you have to have gist bindings for both your 
datatypes before you build the multikey index. There are some btree_gist 
bindings in the pgsql contrib directory. Probably suitable for testing. 
Your create index statement would end up looking something like:

create index blahidx on blah using gist (geom gist_geometry_ops,other 
gist_other_btree_ops);

So just like other multikey indexes, only using pure gist. The ultimate 
solution would be to write gist bindings for absolutely all the pgsql 
data types. Right now the contrib package only has a few.

I am not sure whether (a) or (b) will be more effective. We have had 
mixed results with multikey. Using stats has been effective as 
advertised, but can still be slow on big data sets, or with indexes that 
poorly segment the data.

P

Charlton Purvis wrote:
> Hi, folks:
> 
> I poked around on the discussion lists here as well as in pgsql land,
> and I don't have a clear picture on making multi-column indexes.
> 
> If my table looks like this:
> 
> sea_coos_model=# \d bari_um;
>                     Table "bari_um"
>    Column    |            Type             | Modifiers 
> -------------+-----------------------------+-----------
>  ubari       | double precision            | 
>  vbari       | double precision            | 
>  file_date   | date                        | 
>  time_index  | integer                     | 
>  time_stamp  | timestamp without time zone | 
>  the_geom    | geometry                    | 
>  speed       | double precision            | 
>  theta       | double precision            | 
>  label_theta | double precision            | 
>  label_speed | integer                     | 
>  label_char  | character(1)                | 
>  xi          | double precision            | 
>  yi          | double precision            |
> 
> I'd like to create an index something like this:
> 
> create index bari_um__multi on bari_um using btree(time_stamp),
> gist(the_geom);
> 
> No doubt that doesn't work.  But is there a way for me to do this?  Some
> multi-column indexing stuff appears here,
> http://www.sai.msu.su/~megera/postgres/gist/, but perhaps that is old?
> 
> Bottom line is that I want to tell the db to look for the time_stamp
> before making any georeferenced comparisons.
> 
> Thanks,
> 
> Charlton
> 
>  
>  
>  
> Charlton Purvis
> (803) 777-8858 : voice
> (803) 777-8833 : fax
> cpurvis at sc.edu
>  
> Advanced Solutions Group
> Department of Physics and Astronomy
> University of South Carolina
> Columbia, SC 29208
> 
> 
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users

-- 
       __
      /
      | Paul Ramsey
      | Refractions Research
      | Email: pramsey at refractions.net
      | Phone: (250) 885-0632
      \_




More information about the postgis-users mailing list