[postgis-users] Re: Transform Performance

Charlie Savage cfis at interserv.com
Wed Oct 26 13:17:45 PDT 2005


Very interesting.  Following your lead I created this function and then 
ran it through the scenarios you discuss below.

CREATE OR REPLACE FUNCTION
testme(value int) RETURNS int
AS $$
BEGIN
	RAISE INFO 'testme: %', value;
	RETURN value;
END;
$$
LANGUAGE plpgsql IMMUTABLE;


I thought, but was wrong, that in this case the function would only be 
called once:

select testme(MyField) from MyTable;

I had hoped that Postgresql would cache the value of the input 
parameter, see that testme had already been invoked for that parameter, 
and skip the evaluation.  However, it does not, the method get called 
for every record.  From the Postgresql docs (emphasis is mine):

"An IMMUTABLE function cannot modify the database and is guaranteed to 
return the same results given the same arguments forever. This category 
allows the optimizer to pre-evaluate the function when a query calls it 
with *constant* arguments."

> 
> POSSIBLE OPTIMIZATIONS
> 
> First optimization that comes to mind is reducing scans by making
> outer-level get_proj4_from_srid() calls take a constant argument:
> 
> 	transform_geometry(g, get_proj4_from_srid(find_srid(..)),
> 		get_proj4_from_srid(4326));
> 

Perhaps a quick simple way to do this is to create an overloaded version 
of transform that takes both the source srs and targer srs as constants. 
  That would get rid of all the SRID calls, and all but two of the 
get_proj4_from_srid calls.  Thus it would be a lot faster, but not much 
harder to use.

Thanks,

Charlie






More information about the postgis-users mailing list