Re: JDBC prepared statement is not treated as prepared statement

From: 高健 <luckyjackgao(at)gmail(dot)com>
To: Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
Cc: pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: JDBC prepared statement is not treated as prepared statement
Date: 2013-06-18 09:01:51
Message-ID: CAL454F3sZxhXmZF5khuf=Otd+ndnyTYUYsFXv1Kz6oy+OtnFCw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hello :

>Server prepared statements are kept in the private memory of the
>PostgreSQL backend process. If you need a statement only once or
>twice, it would be wasteful to keep it around.
>The idea is that it is worth the effort only if the statement is executed
>more than a couple of times.

Thank you . I think it is an exciting point for PG.

This make it "clever" to choice those always executed sql.

Thanks!

2013/6/18 Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>

> 高健 wrote:
> > I change my Java program by adding the following:
> >
> > org.postgresql.PGStatement pgt = (org.postgresql.PGStatement)pst;
> > pgt.setPrepareThreshold(1);
> >
> > I can see an entry is in pg_prepared_statements now.
>
> Good.
>
> > But the hyperlink's documentation made me a little confused. I also
> wonder why the threshold option is
> > designed .
> >
> > The document said:
> >
> > ---------------------------------------------
> >
> > The PostgreSQL™ server allows clients to compile sql statements that are
> expected to be reused to
> > avoid the overhead of parsing and planning the statement for every
> execution. This functionality is
> > available at the SQL level via PREPARE and EXECUTE beginning with server
> version 7.3
> >
> > …
> >
> > An internal counter keeps track of how many times the statement has
> been executed and when it reaches
> > the threshold it will start to use server side prepared statements.
> >
> > …
> >
> > -----------------------------------------------
> >
> > What does < clients to compile sql statements > mean?
> >
> > I think that maybe the document just want to say:
> >
> >
> ------------------------------------------------------------------------------------------------------
> > ---------------------------------------
> >
> > Before PG import support for prepared statement,
> >
> > PG server must parse and plan statement every time when the client send
> a request.
> >
> > Even when the same statement will be executed many times.
> >
> >
> >
> > After PG import support for prepared statement,
> >
> > When using those statement which is expected reused, by using prepared
> statement mechanism,
> >
> > PG server can avoid overhead of parsing and planning again and again.
> >
> >
> >
> > But in order to use prepared statement, The client also must do
> something:
> >
> > When using psql,
> >
> > we need to use Prepare command
> >
> >
> >
> > When using java,
> >
> > we use java.sql.preparedstatement,
> >
> > but it is not engouth: we also need to use org.postgresql.PGStatement
> 's setthreshold method to let
> > PG server know.
> >
> >
> >
> > The client must do something to let PG server realize that client want
> PG server to use prepared
> > statement.
> >
> > That is why the docmument say "clients to compile sql statements".
>
> I think that it is helpful to explain what the JDBC driver does internally.
>
> If you do not set the threshold or the threshold is not yet exceeded,
> the driver will execute the statement as a simple statement (which
> corresponds to libpq's PQexec).
>
> Once the threshold is exceeded, the next execution will prepare
> the statement (corresponding to libpq's PQprepare) and then execute
> it (like libpq's PQexecPrepared).
>
> Subsequent executions will only execute the named prepared statement.
>
> I think that "compile" in the text you quote stands for "prepare".
>
> > And for the threshold,
> >
> > If the threshold has not reached, PG server will consider the sql
> statement a common one, and will
> > parse and plan for it every time.
> >
> > Only when the threshold is reached, PG server will realize that client
> need it to hold the statement
> > as prepared ,then parsed it and hold the plan.
> >
> >
> -----------------------------------------------------------------------------------------------------
> >
> >
> >
> > Is my understanding right?
>
> Server prepared statements are kept in the private memory of the
> PostgreSQL backend process. If you need a statement only once or
> twice, it would be wasteful to keep it around.
> The idea is that it is worth the effort only if the statement is executed
> more than a couple of times.
>
> Yours,
> Laurenz Albe
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message 高健 2013-06-18 09:09:05 I want to make an example of using parameterized path
Previous Message sachin kotwal 2013-06-18 08:52:58 Migration from DB2 to PostgreSQL