[postgis-users] Very long time for a bbox/within query

Paul Ramsey pramsey at refractions.net
Tue Jul 20 14:58:57 PDT 2004


I think I like this construction better...

select v_boundary.v_bndry_id, count(*)
from parcels,v_boundary
where
   v_boundary.the_geom && parcels.the_geom
   and
   within(v_boundary.the_geom,parcels.the_geom)
   and
   v_bndry_type = 'FIPS'
group by v_boundary.v_bndry_id;

Gregory S. Williamson wrote:

> Dear peoples,
> 
> I have a query which is taking a while to complete and I am wondering if I have missed some obvious thing.
> 
> We have a lot of vector data in various tables (statistics, roads, flood plains, parcel data, etc.). We need to be able to know at runtime which types of data for a given geographic area (currently a county, or FIPs code  but this might be a zip or MSA in other applications). So, I thought, lets build a cross-reference table with an entry for each table/area which has data.
> 
> Works well for most of the tables (lines, points and polygons), taking a few minutes to cross reference the 5000+ FIPS for each target table. Alas, though, we have a modest size table (parcels, about 4.1 million rows) which takes so long to run that i was convinced I had a bug. Eventually was patient enough to let it run and lo! and behold! it does work, but slowly.
> 
> Any suggestions would be most welcome !
> 
> This is the current query:
> 
> SELECT 1 FROM parcels WHERE the_geom && (SELECT box3d((SELECT v_bndry_geometry FROM v_boundry WHERE v_bndry_type = 'FIPS' AND v_bndry_id =
>  '12009')))::box3d AND within(the_geom, (SELECT v_bndry_geometry FROM v_boundry WHERE v_bndry_type = 'FIPS' AND v_bndry_id = '12009'));
> 
> And this is what explain analyze says:
>  Index Scan using parcels_s_ndx on parcels  (cost=154.24..198.39 rows=7 width=0)
>  (actual time=118806.770..118806.770 rows=0 loops=1)
>    Index Cond: (the_geom && ($1)::geometry)
>    Filter: within(the_geom, $2)
>    InitPlan
>      ->  Result  (cost=77.11..77.13 rows=1 width=0) (actual time=9.209..9.261 rows=1 loops=1)
>            InitPlan
>              ->  Seq Scan on v_boundry  (cost=0.00..77.11 rows=2 width=32) (actual time=5.670..6.327 rows=1 loops=1)
>                    Filter: (((v_bndry_type)::text = 'FIPS'::text) AND ((v_bndry_id)::text = '12009'::text))
>      ->  Seq Scan on v_boundry  (cost=0.00..77.11 rows=2 width=32) (actual time=
> 5.403..6.063 rows=1 loops=1)
>            Filter: (((v_bndry_type)::text = 'FIPS'::text) AND ((v_bndry_id)::text = '12009'::text))
>  Total runtime: 118807.170 ms
> (11 rows)
> 
> The parcels table looks like this:
> gex_vector=# \d parcels
>                                     Table "public.parcels"
>      Column     |       Type        |                        Modifiers
> 
> ----------------+-------------------+-------------------------------------------
> ---------------
>  gid            | integer           | not null default nextval('public.parcels_g
> id_seq'::text)
>  s_pin          | character varying |
>  s_id           | character varying |
>  s_parent_p     | character varying |
>  s_state        | character varying |
>  s_city         | character varying |
>  s_zip          | character varying |
>  s_zip_plus     | character varying |
>  s_house        | character varying |
>  s_house2       | character varying |
>  s_fraction     | character varying |
>  s_directio     | character varying |
>  s_street       | character varying |
>  s_suffix       | character varying |
>  s_post_dir     | character varying |
>  s_unit         | character varying |
>  s_unit         | character varying |
>  s_unit_des     | character varying |
>  s_r_type       | character varying |
>  s_r_number     | character varying |
>  s_box_numb     | character varying |
>  s_fips_cou     | character varying |
>  the_geom       | geometry          |
>  track_id       | integer           |
>  ownername      | character varying |
>  owneraddre     | character varying |
>  owneraddre__21 | character varying |
>  owneraddre__22 | character varying |
>  ownercity      | character varying |
>  ownerstate     | character varying |
>  ownerzip       | integer           |
>  ownerzip4      | character varying |
>  the_cntr       | geometry          |
> Indexes:
>     "parcels_pkey" primary key, btree (gid)
>     "parcel_cent_ndx" gist (the_cntr)
>     "parcels_ownername_ndx" btree (ownername)
>     "parcels_s_fips_cou" btree (s_fips_cou)
>     "parcels_s_house_ndx" btree (s_house)
>     "parcels_s_ndx" gist (the_geom)
>     "parcels_s_pin_ndx" btree (s_pin)
>     "parcels_s_street_ndx" btree (s_street)
> Check constraints:
>     "$1" CHECK (srid(the_geom) = 4326)
>     "$2" CHECK (geometrytype(the_geom) = 'MULTIPOLYGON'::text OR the_geom IS NULL)
> Foreign-key constraints:
>     "trackid_fk" FOREIGN KEY (track_id) REFERENCES v_detail(track_id)
> 
> [overindexed I think but this isn't "mine" in design]
> 
> And the boundry table is:
>  v_bndry_type     | character varying(20)  | not null
>  v_bndry_id       | character varying(100) | not null
>  v_bndry_ref_id   | integer                | not null default nextval('public.v_boundry_v_bndry_ref_id_seq'::text)
>  v_bndry_geometry | geometry               |
> Indexes:
>     "v_boundry_pkey" primary key, btree (v_bndry_ref_id)
> Check constraints:
>     "$2" CHECK (srid(v_bndry_geometry) = -1)
> Foreign-key constraints:
>     "$1" FOREIGN KEY (v_bndry_type) REFERENCES v_bndry_types(v_bndry_t_code)
> 
> Thanks for your time !
> 
> Greg Williamson
> DBA
> GlobeXplorer LLC
> 
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users




More information about the postgis-users mailing list