Caching/Indexing Function Output

Started by Mikeover 21 years ago3 messagesgeneral
Jump to latest
#1Mike
mike@mrhost.ca

Hello,

I've written several functions using the SPI_ interface, some of them are to
simply ease inserting into a few tables-

ie- I wrote a function sp_host('10.0.0.1'); which returns the id of the
given
ip address from a ip_addresses table if it exists, otherwise, it inserts it,
and
returns that id. We use this to keep the logic simple when inserting new
entries
into a weblogs table-

insert into weblogs (..., host) values (..., sp_host('10.0.0.1'));

We also use this for a dozen or so other similar tables-

My question is- is there anyway, since a call to sp_host('10.0.0.1') will
always
return the same value (the primary key/sequence value from the ip_addresses
table), to cache/index that value somehow, so anytime I ever call that same
function, with the same argument, it returns a cached/indexed value?

ie- I make an initial call to sp_host('10.0.0.1'), which returns the id
1000; the
system caches this, and stores:

function=sp_host, arg='10.0.0.1', return=1000

or

key=sp_host('10.0.0.1'), value=1000

the next time I call sp_host, with the same arg, it simply returns 1000,
instead
of actually calling the function?

clearly I don't want to do this for *all* the functions I've written, but it
would
probably speed these functions up considerably?

Thanks!

Mike Pultz
mike@mrhost.ca

#2Michael Fuhr
mike@fuhr.org
In reply to: Mike (#1)
Re: Caching/Indexing Function Output

On Thu, Dec 23, 2004 at 01:22:42PM -0800, Mike wrote:

My question is- is there anyway, since a call to sp_host('10.0.0.1') will
always
return the same value (the primary key/sequence value from the ip_addresses
table), to cache/index that value somehow, so anytime I ever call that same
function, with the same argument, it returns a cached/indexed value?

Some procedural languages (PL/Tcl, PL/Python; also PL/Perl in 8.0)
have global data that you could use as a cache. The function would
still be called each time, but you could at least use the cache to
save the cost of a database query.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

#3Mike
mike@mrhost.ca
In reply to: Mike (#1)
Re: Caching/Indexing Function Output

On Thu, Dec 23, 2004 at 01:22:42PM -0800, Mike wrote:

My question is- is there anyway, since a call to sp_host('10.0.0.1')

will

always
return the same value (the primary key/sequence value from the

ip_addresses

table), to cache/index that value somehow, so anytime I ever call that

same

function, with the same argument, it returns a cached/indexed value?

Some procedural languages (PL/Tcl, PL/Python; also PL/Perl in 8.0)
have global data that you could use as a cache. The function would
still be called each time, but you could at least use the cache to
save the cost of a database query.

All the functions I wrote are in C-

So yeah, I guess I could have a global key/value hash that I keep up from
inside the
functions, and if the ip address exists, then return the value, otherwise
actually
execute the function.

I could probably use something like libmm if I didn't have access to global
vars, and
store them in shared memory- I was just hoping to have something that
postgres
would manage automagically for me. :)

It would also be cool if the planner could decide which to use- ie it would
be
considered cheaper to use the cache then call the function if the ip address
was
listed.

Thanks-

Mike