[postgis-devel] RE: estimates problems and 1.0.0 delay

strk at refractions.net strk at refractions.net
Thu Apr 21 18:04:20 PDT 2005


Yes, I should have done this before... will be in for 1.0.1.
Committed in both HEAD and 1.0 branches.
I didn't think it was so easy to exploit...
--strk;

On Thu, Apr 21, 2005 at 02:57:50PM -0700, Ron Mayer wrote:
> strk at refractions.net wrote:
> >Mark, BTW, here is another warm.
> >Single point in table, invalid join selectivity:
> 
> I think I've actually encountered this issue in a real (non-contrived test 
> case) query,
> after all the tables were just ANALYZEd immediatelly before running the 
> query.
> 
>   fli=# select * from rtgr.landpoly,
>                       userfeatures.area_features
>                 where rtgr.landpoly.the_geom && 
>                 userfeatures.area_features.the_geom
>                   and 
>                   intersects(rtgr.landpoly.the_geom,userfeatures.area_features.the_geom)
>                   and userfeatures.area_features.feature_id=7;
> 
>   ERROR:  invalid join selectivity: 1.003720
> 
> What's happening here is that the "landpoly" contains all the polygons for
> landmarks in the county; and "area_features" is a user-defined polygon that
> the user creates by drawing on a map with a mouse. There's nothing the
> prohibits a user from drawing a polygon that encloses the entire county
> (effectively saying that he wants to select all the landmarks).
> 
> 
> When I do this, if I understand selectivity right, I guess you'd expect the
> selectivity to be somewhere around one (so the estimaror is making a
> very good guess, only 0.3% off); but in this case rounding pushed it
> slightly above one.   From the error message, I'm guessing it's saying
> that values over 1 are not legal?
> 
> It make me wonder if we'd want something like this.  (I also wonder
> it for the stuff around line 724, but I wasn't hitting that condition.)
> 
> 
> greenie postgis-1.0.0/lwgeom> diff -c lwgeom_estimate.c.~1~ 
> lwgeom_estimate.c
> *** lwgeom_estimate.c.~1~       Mon Apr 18 07:12:59 2005
> --- lwgeom_estimate.c   Thu Apr 21 14:49:36 2005
> ***************
> *** 984,989 ****
> --- 984,991 ----
>                 PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL);
>         }
> 
> +         if ( rows_returned > total_tuples )
> +               PG_RETURN_FLOAT8(1.0);
>         PG_RETURN_FLOAT8(rows_returned / total_tuples);
>   }
> 
> 
> 
> 
> 
> >strk=# explain analyze select * from t1 a, t1 b where a.g && b.g;          
> >NOTICE:  LWGEOM_gist_joinsel called with jointype 0
> >NOTICE:  Working with relations oids: 4150592 4150592
> >NOTICE:   -- geomstats1 box: 1 1, 1 1
> >NOTICE:   -- geomstats2 box: 1 1, 1 1
> >NOTICE:   -- calculated intersection box is : 1 1, 1 1
> >NOTICE:   search_box contains histogram, returning 1
> >NOTICE:   search_box contains histogram, returning 1
> >NOTICE:  selectivity1: 1   selectivity2: 1
> >NOTICE:  Rows from rel1: 1.000000
> >NOTICE:  Rows from rel2: 1.000000
> >NOTICE:  Estimated rows returned: 4.000000
> >ERROR:  invalid join selectivity: 4.000000
> >
> >What about using selectivity1 * selectivity2 ?
> >It would allow use to avoid total_tuples lookup.
> >Would it be correct ?
> >
> >--strk;
> >
> >
> _______________________________________________
> postgis-devel mailing list
> postgis-devel at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-devel



More information about the postgis-devel mailing list