Thanks Merlin,
I'll take a better look at CTE.

Best regards
Seref


On Tue, Nov 27, 2012 at 4:48 PM, Merlin Moncure <mmonc...@gmail.com> wrote:

> On Tue, Nov 27, 2012 at 10:06 AM, Seref Arikan <serefari...@gmail.com>
> wrote:
> > I have a function that creates a temp table, inserts rows into it,
> performs
> > joins, and returns a single integer as a result. This is pg 9.1. All
> > sessions are using the exact same temp table structure.
> > re performance requirements: I need this function to return as fast as
> > possible :) On a production server, if the function can complete in
> around
> > 10-20 milliseconds, it would be really good (below 10 ms would be great).
> > The average number of inserted into temp table is around 800, and there
> are
> > about 10 columns in the current design.
>
> Well, one thing to explore is use of CTE.  general structure is:
> WITH temp_data AS
> (
>   SELECT a_bunch_of_stuff ..
> ),
> modify_something AS
> (
>   UPDATE something_else
>   FROM temp_data ...
>   RETURNING *
> )
> SELECT result_code
> FROM modify_something ...;
>
> There are some pros and cons with this approach vs classic temp table
> generation.
> Pros:
> *) since 9.1 and 'data modifying with' feature, you are not very much
> constrained
> *) dispense with traditional headaches in terms of managing temp tables
> *) very neat and clean
> Cons:
> *) can't build indexes
>
> A hybrid approach, which is more complicated, is to organize a
> permanent table with the current transaction id (via
> txid_current()::text) as the left most part of the primary key.
>
> CREATE TABLE transaction_data
> (
>   xid text default txid_current()::text,
>   keyfield1 int,
>   keyfield2 text,
>   [data fields]
> );
>
> This is really fast since the data/indexes are ready to go at all
> time.  Your function always inserts, cleanup of stale transaction
> records we can dispense to background process, particularly if you can
> find appropriate time to TRUNCATE the table (which would hiccup
> processes using the table).
>
> merlin
>

Reply via email to