Thread: Batch with keygen?

Batch with keygen?

From
"Mike Clements"
Date:
Hi everyone,
I've got a bunch of PreparedStatements doing inserts on tables with
primary keys generated by sequences. For example, insert on table A,
take generated primary key, insert on table B assigning foreign key
generated value for A's primary key.

For performance reasons, I need to batch these commands. But I don't see
how it would be possible to continue using this approach with a batch of
commands, because I need the results of the first insert to make the
second insert. Is there some way to do this or am I going to have to
stop using keygen and instead have my application generate its own keys?

Thanks.

Michael R. Clements
Principal Architect, Actional Corp.
mclements@actional.com
FREE! Actional SOAPstation Developer Version
Web services routing, security, transformation and versioning
http://www.actional.com/sstdownload

Re: Batch with keygen?

From
Kris Jurka
Date:

On Mon, 7 Nov 2005, Mike Clements wrote:

> I've got a bunch of PreparedStatements doing inserts on tables with
> primary keys generated by sequences. For example, insert on table A,
> take generated primary key, insert on table B assigning foreign key
> generated value for A's primary key.
>
> For performance reasons, I need to batch these commands. But I don't see
> how it would be possible to continue using this approach with a batch of
> commands, because I need the results of the first insert to make the
> second insert. Is there some way to do this or am I going to have to
> stop using keygen and instead have my application generate its own keys?
>

One option would be to tune your sequence generator to your batch size,
consider: CREATE SEQUENCE myseq INCREMENT BY 100;  Then if you fetch a
nextval you know that you are also free to use the next 99 values as well
in your batch statement without touching the sequence.

Kris Jurka

Re: Batch with keygen?

From
Dave Cramer
Date:
Additionally you should be aware, that using this mechanism once a
connection gets a hundred values, they are consumed even if you don't
use them.

Dave
On 7-Nov-05, at 4:18 PM, Kris Jurka wrote:

>
>
> On Mon, 7 Nov 2005, Mike Clements wrote:
>
>> I've got a bunch of PreparedStatements doing inserts on tables with
>> primary keys generated by sequences. For example, insert on table A,
>> take generated primary key, insert on table B assigning foreign key
>> generated value for A's primary key.
>>
>> For performance reasons, I need to batch these commands. But I
>> don't see
>> how it would be possible to continue using this approach with a
>> batch of
>> commands, because I need the results of the first insert to make the
>> second insert. Is there some way to do this or am I going to have to
>> stop using keygen and instead have my application generate its own
>> keys?
>>
>
> One option would be to tune your sequence generator to your batch
> size, consider: CREATE SEQUENCE myseq INCREMENT BY 100;  Then if
> you fetch a nextval you know that you are also free to use the next
> 99 values as well in your batch statement without touching the
> sequence.
>
> Kris Jurka
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 6: explain analyze is your friend
>


Re: Batch with keygen?

From
Andres Olarte
Date:

This looks like a typical example that will benefit from a stored procedure.  Its a bit more work, but much better performace.  You can then batch any ammount of inserts with very good results

Creating your own keys is normally not a good idea.

passing parameters to function

From
"Srivats"
Date:
Hi All,
 
Suppose I have a store proc which accepts 4 input parameters
and I do a CallableStatement.setObject( 1, "..,,," );
and execute the query .
 
It gives me that number of arguments need 4, but found only 1
 
(java.sql.SQLException:Incorrect number of arguments for PROCEDURE FHLMC.test1; expected 4, got 1)
 
during runtime. Should i set the other 3 input parameters to null,
even when I dont want to pass these parameters to the SP.
 
Thks
 
 

Re: Batch with keygen?

From
Nelson Arape
Date:
Maybe I am a bit off, but the old friends curval() and nextval() don't do the
trick? I mean

con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO TABLEA " +
              "VALUES(nextval('TABLEA_PK_SEQ'), 1, 2, 3)");
stmt.addBatch("INSERT INTO TABLEB " +
              "VALUES(curval('TABLEA_PK_SEQ'), 4, 5, 6)");
...
int [] updateCounts = stmt.executeBatch();

Bye
Nelson Arapé
PS: sorry for my English

El Lun 07 Nov 2005 20:01, Dave Cramer escribió:
> Additionally you should be aware, that using this mechanism once a
> connection gets a hundred values, they are consumed even if you don't
> use them.
>
> Dave
>
> On 7-Nov-05, at 4:18 PM, Kris Jurka wrote:
> > On Mon, 7 Nov 2005, Mike Clements wrote:
> >> I've got a bunch of PreparedStatements doing inserts on tables with
> >> primary keys generated by sequences. For example, insert on table A,
> >> take generated primary key, insert on table B assigning foreign key
> >> generated value for A's primary key.
> >>
> >> For performance reasons, I need to batch these commands. But I
> >> don't see
> >> how it would be possible to continue using this approach with a
> >> batch of
> >> commands, because I need the results of the first insert to make the
> >> second insert. Is there some way to do this or am I going to have to
> >> stop using keygen and instead have my application generate its own
> >> keys?
> >
> > One option would be to tune your sequence generator to your batch
> > size, consider: CREATE SEQUENCE myseq INCREMENT BY 100;  Then if
> > you fetch a nextval you know that you are also free to use the next
> > 99 values as well in your batch statement without touching the
> > sequence.
> >
> > Kris Jurka
> >
> > ---------------------------(end of
> > broadcast)---------------------------
> > TIP 6: explain analyze is your friend
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>        choose an index scan if your joining column's datatypes do not
>        match

Re: Batch with keygen?

From
"Mike Clements"
Date:
Thanks everyone for all the ideas. I am going the route of stored procedures. This lets me keep my DB generated keys,
whilealso greatly reducing the number of SQL round trips, which will improve performance, all without denormalizing the
schema.

I was hoping to avoid using stored procedures because we support multiple different DBs so it means writing them on
variousdifferent platforms. But it looks like this is the only real option. 


> -----Original Message-----
> From: pgsql-jdbc-owner@postgresql.org
> [mailto:pgsql-jdbc-owner@postgresql.org] On Behalf Of Nelson Arape
> Sent: Tuesday, November 08, 2005 4:50 AM
> To: pgsql-jdbc@postgresql.org
> Subject: Re: [JDBC] Batch with keygen?
>
> Maybe I am a bit off, but the old friends curval() and
> nextval() don't do the
> trick? I mean
>
> con.setAutoCommit(false);
> Statement stmt = con.createStatement();
> stmt.addBatch("INSERT INTO TABLEA " +
>               "VALUES(nextval('TABLEA_PK_SEQ'), 1, 2, 3)");
> stmt.addBatch("INSERT INTO TABLEB " +
>               "VALUES(curval('TABLEA_PK_SEQ'), 4, 5, 6)");
> ...
> int [] updateCounts = stmt.executeBatch();
>
> Bye
> Nelson Arapé
> PS: sorry for my English
>
> El Lun 07 Nov 2005 20:01, Dave Cramer escribió:
> > Additionally you should be aware, that using this mechanism once a
> > connection gets a hundred values, they are consumed even if
> you don't
> > use them.
> >
> > Dave
> >
> > On 7-Nov-05, at 4:18 PM, Kris Jurka wrote:
> > > On Mon, 7 Nov 2005, Mike Clements wrote:
> > >> I've got a bunch of PreparedStatements doing inserts on
> tables with
> > >> primary keys generated by sequences. For example, insert
> on table A,
> > >> take generated primary key, insert on table B assigning
> foreign key
> > >> generated value for A's primary key.
> > >>
> > >> For performance reasons, I need to batch these commands. But I
> > >> don't see
> > >> how it would be possible to continue using this approach with a
> > >> batch of
> > >> commands, because I need the results of the first insert
> to make the
> > >> second insert. Is there some way to do this or am I
> going to have to
> > >> stop using keygen and instead have my application
> generate its own
> > >> keys?
> > >
> > > One option would be to tune your sequence generator to your batch
> > > size, consider: CREATE SEQUENCE myseq INCREMENT BY 100;  Then if
> > > you fetch a nextval you know that you are also free to
> use the next
> > > 99 values as well in your batch statement without touching the
> > > sequence.
> > >
> > > Kris Jurka
> > >
> > > ---------------------------(end of
> > > broadcast)---------------------------
> > > TIP 6: explain analyze is your friend
> >
> > ---------------------------(end of
> broadcast)---------------------------
> > TIP 9: In versions below 8.0, the planner will ignore your desire to
> >        choose an index scan if your joining column's
> datatypes do not
> >        match
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
>                http://www.postgresql.org/docs/faq
>
>