It might be worth checking out the pre_prepare module: http://preprepare.projects.postgresql.org/README.html
Cheers, Ken On Mon, Nov 01, 2010 at 08:45:17PM +0100, Jeroen Geilman wrote: > On 11/01/2010 08:40 PM, Patrick Ben Koetter wrote: >> Jeroen, >> >> thanks for the detailed answer. Please read my annotations below. >> >> * Jeroen Geilman<jer...@adaptr.nl>: >> >>> On 11/01/2010 07:35 PM, Patrick Ben Koetter wrote: >>> >>>> Out of curiosity I started to play around with Postfix and PostgreSQL. >>>> PostgreSQL recommends "prepared statements" to speed up queries (by >>>> ~%20). >>>> >>> From the 8.0 manual: >>> >>> Prepared statements have the largest performance advantage when a >>> single session is being used to execute a large number of similar >>> statements. The performance difference will be particularly >>> significant if the statements are complex to plan or rewrite, for >>> example, if the query involves a join of many tables or requires the >>> application of several rules. *If the statement is relatively simple >>> to plan and rewrite but relatively expensive to execute, the >>> performance advantage of prepared statements will be less >>> noticeable.* >>> >>> It is doubtful whether a simple key lookup query - such as postfix >>> does - benefits from PSs. >>> >> Agreed. I doubt that too, but I don't know a better approach to prove that >> except for trying and measuring. >> >> >> > > You're obviously free to do that - but as Victor said, postfix doesn't > support preparing statements, so you'd have to hack the driver :) > >>> If the postgres database in question is used primarily to lookup >>> postfix maps, every possible value will be cached in RAM for 99% of >>> the time anyway - this gives incomparably larger advantages than >>> writing faster queries. >>> >> So the best approach is to ensure all tables can be loaded into memory >> i.e. >> provide enough $work_mem in pgSQL? >> >> > > Even the indexes would be enough. It depends on how big your dataset is. > >>>> As I understand it "prepared statements" must be defined once when a DB >>>> session starts and they will be available only to the particular client >>>> that >>>> requested the "prepared statement". Any subsequent client connecting >>>> will have >>>> to PREPARE a "prepared statement" for itself. >>>> >>> A prepared statement remains in memory during a session, yes. >>> >>> >>>> I see I can get around multiple PREPARE statements if I use the Postfix >>>> proxymap daemon, but how would I send the initial PREPARE query? >>>> >>> That's untrivial, since even a proxymap connection doesn't live forever. >>> All postfix processes are recycled after a period of time. >>> >>> If the Pl/pgSQL language allows it, you could write a SP that checks >>> if the statement is already prepared, and then execute it. >>> This will have a lot more overhead than the potential gain from >>> preparing it. >>> >> Do I understand you correctly? Are you saying the potential gain is not >> worth >> the effort? >> > > I am saying exactly what I am saying ;) > > Given that A. postfix does not support preparing the select_query, and B. > indexing properly will provide much bigger gains than any other measure > (orders of magnitude bigger gains), and C. the manual suggests that using > prepared statements is much less beneficial for simple queries, odds are > that it's not going to be worth the effort. > >>> You should have absolutely no delusions about the performance cost >>> of this extra check - just writing a stored procedure that runs the >>> SELECT will win every single time. >>> >>> > > Thus. > > > -- > J. > >