This alternative was a little faster and does not return duplicated rows. It
will take 41 hours on my system, but it will have to do for now.

SELECT vciia_main.sitrp,vciia_main.date_time,ST_AsText(vciia_main.geom) from
vciia_main, south_vietnam72 where st_within(vciia_main.geom,
south_vietnam72.geom) and (st_dwithin(vciia_main.geom, (select the_geom from
houses order by st_distance(vciia_main.geom, the_geom)  limit 1), 500) OR
st_dwithin(vciia_main.geom, (select geom from roads order by
st_distance(vciia_main.geom, geom)  limit 1), 500) OR
st_dwithin(vciia_main.geom, (select geom from rails order by
st_distance(vciia_main.geom, geom)  limit 1), 500) OR
st_dwithin(vciia_main.geom, (select geom from city order by
st_distance(vciia_main.geom, geom)  limit 1), 800)) and vciia_main.date_time
is not null;

-Håvard

2011/1/13 Nicklas Avén <nicklas.a...@jordogskog.no>

> No, the order is not supposed to make any difference. The planner plans
> the query from costs and statistics and shouldn't care about the order
> (I think)
>
> What you should do is to divide the big geometries and build new index.
>
> That can be done by building a grid with generate_series and cutting the
> geometry against that grid by using ST_Intersection between the grid and
> your geometry. I have not tried it myself so I don't have any query
> written for it.
>
> Another way that might be simplier is to use some other map than taht
> south Vietnam map. If you have some map with smaller regions instead the
> index will be more efficiency.
>
> Also use ST_Dump to tear apart all geometries as much as possible.
>
> Then build a new index and analyse for the planner to know what you have
> done.
>
> One thing to remember is that you in many cases will get the same
> geometry many times because it is within the given distance to many of
> your regions like ST_Intersects(Mjøsa, fylker) will give many
> fylke-mjøsa combinations.
>
> Regards
>
> Nicklas
>
>
>
>
> On Thu, 2011-01-13 at 21:51 +0100, Håvard Wahl Kongsgård wrote:
> > Hi, so one solution is to use the most common feature first (), in
> > this case the houses ?
> >
> > |What version of PostGIS are you using?
> >
> > 1.5.1
> >
> >
> > 2011/1/13 Nicklas Avén <nicklas.a...@jordogskog.no>
> >         Hallo Håvard
> >
> >         The planner is supposed to take care of that. It estimates
> >         ehat is the
> >         cheapest part of the OR statements and checks that. If true,
> >         then
> >         nothing is done with the others.
> >
> >         Do you have spatial indexes on the geometry columns?
> >
> >         Do you know if they are used by the planner?
> >
> >         Even if the indexes is in place and are used this query will
> >         probably be
> >         slow because of how the spatial index works.
> >
> >         What the spatial index does for ST_Within and ST_DWithin is to
> >         tell if
> >         the geometries has overlapping bounding boxes (or expanded
> >         bounding
> >         boxes in ST_DWithin case). If they do the index is of no more
> >         help and
> >         the rest of the calculation has to be done vertex by vertex
> >         which is
> >         costly.
> >
> >         So, the problem is when the bounding boxes covers many
> >         geoemtries, then
> >         the part of the work that the index can help with is small.
> >
> >         There is techniques to slice the big geometry in smaller
> >         pieces, build a
> >         new index and things will go faster.
> >
> >         Long roads often have this problem. If you want to find all
> >         houses along
> >         a road the bounding box test will find many more houses than
> >         those close
> >         to the road (If the road is not going just north/south or
> >         east/west)
> >
> >         I don't think it should do any difference for the planner but
> >         I would
> >         test to build the query with joins instead.
> >
> >         What version of PostGIS are you using?
> >
> >
> >
> >
> >
> >
> >
> >         Regards
> >
> >         Nicklas Avén
> >
> >
> >
> >         On Thu, 2011-01-13 at 17:47 +0100, Håvard Wahl Kongsgård
> >         wrote:
> >         > Hi, I have a spatial query with multiple OR statements, for
> >         large
> >         > tables it's very slow. Is it possible to skip the spatial
> >         lookup on
> >         > the other conditions if first(previous) condition equal 1,
> >         and thereby
> >         > increase the performance?
> >         >
> >         > SELECT vciia_main.sitrp,vciia_main.date_time from
> >         vciia_main,
> >         > south_vietnam72, roads, rails, houses, city where
> >         > st_within(vciia_main.geom, south_vietnam72.geom) and
> >         date_time is not
> >         > null and (st_dwithin(vciia_main.geom, roads.geom, 500) OR
> >         > st_dwithin(vciia_main.geom, rails.geom, 500) or
> >         > st_dwithin(vciia_main.geom, city.geom, 800) or
> >         > st_dwithin(vciia_main.geom, houses.the_geom, 500))
> >         >
> >         > --
> >         > Håvard Wahl Kongsgård
> >         > Peace Research Institute Oslo (PRIO)
> >         >
> >         > http://havard.security-review.net/
> >         >
> >
> >
> >
> >
> >
> >
> > --
> > Håvard Wahl Kongsgård
> > Peace Research Institute Oslo (PRIO)
> >
> > http://havard.security-review.net/
> >
>
>
>


-- 
Håvard Wahl Kongsgård
Peace Research Institute Oslo (PRIO)

http://havard.security-review.net/

Reply via email to