Обсуждение: Conditional commit inside functions
Hello!
I want to translate the following Oracle PL/SQL script into plpgsql.
Especially I'm having problems with the transaction thing. i tried START
TRANSACTION and COMMIT without success.
Any ideas?
Thanx.
Ciao,
Gerhard
CREATE OR REPLACE PROCEDURE insert_1Mio
IS
maxcommit NUMBER;
BEGIN
maxcommit := 10000;
FOR i IN 1..1000000 LOOP
INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i, 'John' || to_char(i), 'Smith' ||
to_char(i));
IF MOD(i, maxcommit) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
--
http://www.wiesinger.com/
Hello, PostgreSQL has doesn't use rollback segment, so commit over 10000 lines is not necessary, and it is bad. Regards Pavel Stehule 2008/12/25 Gerhard Wiesinger <lists@wiesinger.com>: > Hello! > > I want to translate the following Oracle PL/SQL script into plpgsql. > Especially I'm having problems with the transaction thing. i tried START > TRANSACTION and COMMIT without success. > > Any ideas? > > Thanx. > > Ciao, > Gerhard > > CREATE OR REPLACE PROCEDURE insert_1Mio > IS > maxcommit NUMBER; > BEGIN > maxcommit := 10000; > > FOR i IN 1..1000000 LOOP > INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i, > 'John' || to_char(i), 'Smith' || to_char(i)); > IF MOD(i, maxcommit) = 0 THEN > COMMIT; > END IF; > END LOOP; > > COMMIT; > END; > > > > -- > http://www.wiesinger.com/ > > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general >
On Thu, Dec 25, 2008 at 2:58 PM, Pavel Stehule <pavel.stehule@gmail.com> wrote:
If you are having database in your laptop it might be true.
In OLTP environments it's not feasible to have large transactions
a) because of locking problems
b) lot's of databases use some kind of replication to have fail over databases doing large updates in such environments causes problems.
We use data_maintainer.py script from SkyTools package to do such updates.
regards
Asko
Hello,
PostgreSQL has doesn't use rollback segment, so commit over 10000
lines is not necessary, and it is bad.
If you are having database in your laptop it might be true.
In OLTP environments it's not feasible to have large transactions
a) because of locking problems
b) lot's of databases use some kind of replication to have fail over databases doing large updates in such environments causes problems.
We use data_maintainer.py script from SkyTools package to do such updates.
regards
Asko
Regards
Pavel Stehule
2008/12/25 Gerhard Wiesinger <lists@wiesinger.com>:> Hello!
>
> I want to translate the following Oracle PL/SQL script into plpgsql.
> Especially I'm having problems with the transaction thing. i tried START
> TRANSACTION and COMMIT without success.
>
> Any ideas?
>
> Thanx.
>
> Ciao,
> Gerhard
>
> CREATE OR REPLACE PROCEDURE insert_1Mio
> IS
> maxcommit NUMBER;
> BEGIN
> maxcommit := 10000;
>
> FOR i IN 1..1000000 LOOP
> INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i,
> 'John' || to_char(i), 'Smith' || to_char(i));
> IF MOD(i, maxcommit) = 0 THEN
> COMMIT;
> END IF;
> END LOOP;
>
> COMMIT;
> END;
>
>
>
> --
> http://www.wiesinger.com/
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>
--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general
Hello!
I tried the following, but still one transaction:
SELECT insert_1Mio();
(parallel select count(id) from employee; is done)
CREATE OR REPLACE FUNCTION insert_some(start_i INTEGER, end_i INTEGER)
RETURNS void
AS $func$
DECLARE
BEGIN
FOR i IN start_i..end_i LOOP
INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i, 'John' || i, 'Smith' || i);
END LOOP;
END;
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION insert_1Mio() RETURNS void
AS $func$
DECLARE
maxcommit INTEGER;
start_i INTEGER;
end_i INTEGER;
now_i INTEGER;
BEGIN
maxcommit := 10000;
start_i :=1;
end_i := 1000000;
now_i := start_i;
FOR i IN start_i..end_i LOOP
IF MOD(i, maxcommit) = 0 THEN
PERFORM insert_some(now_i, i);
now_i := i + 1;
END IF;
END LOOP;
PERFORM insert_some(now_i, end_i);
END;
$func$ LANGUAGE plpgsql;
Any ideas?
Ciao,
Gerhard
--
http://www.wiesinger.com/
On Thu, 25 Dec 2008, Gerhard Wiesinger wrote:
> Hello!
>
> I want to translate the following Oracle PL/SQL script into plpgsql.
> Especially I'm having problems with the transaction thing. i tried START
> TRANSACTION and COMMIT without success.
>
> Any ideas?
>
> Thanx.
>
> Ciao,
> Gerhard
>
> CREATE OR REPLACE PROCEDURE insert_1Mio
> IS
> maxcommit NUMBER;
> BEGIN
> maxcommit := 10000;
>
> FOR i IN 1..1000000 LOOP
> INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i,
> 'John' || to_char(i), 'Smith' || to_char(i));
> IF MOD(i, maxcommit) = 0 THEN
> COMMIT;
> END IF;
> END LOOP;
>
> COMMIT;
> END;
>
>
>
> --
> http://www.wiesinger.com/
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>
Hello why do you need commit? pavel 2008/12/26 Gerhard Wiesinger <lists@wiesinger.com>: > Hello! > > I tried the following, but still one transaction: > > SELECT insert_1Mio(); > > (parallel select count(id) from employee; is done) > > CREATE OR REPLACE FUNCTION insert_some(start_i INTEGER, end_i INTEGER) > RETURNS void > AS $func$ > DECLARE > BEGIN > FOR i IN start_i..end_i LOOP > INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i, > 'John' || i, 'Smith' || i); > END LOOP; > END; > $func$ LANGUAGE plpgsql; > > CREATE OR REPLACE FUNCTION insert_1Mio() RETURNS void > AS $func$ > DECLARE > maxcommit INTEGER; > start_i INTEGER; > end_i INTEGER; > now_i INTEGER; > BEGIN > maxcommit := 10000; > start_i :=1; > end_i := 1000000; > > now_i := start_i; > > FOR i IN start_i..end_i LOOP > IF MOD(i, maxcommit) = 0 THEN > PERFORM insert_some(now_i, i); > now_i := i + 1; > END IF; > END LOOP; > PERFORM insert_some(now_i, end_i); > END; > $func$ LANGUAGE plpgsql; > > Any ideas? > > Ciao, > Gerhard > > -- > http://www.wiesinger.com/ > > > On Thu, 25 Dec 2008, Gerhard Wiesinger wrote: > >> Hello! >> >> I want to translate the following Oracle PL/SQL script into plpgsql. >> Especially I'm having problems with the transaction thing. i tried START >> TRANSACTION and COMMIT without success. >> >> Any ideas? >> >> Thanx. >> >> Ciao, >> Gerhard >> >> CREATE OR REPLACE PROCEDURE insert_1Mio >> IS >> maxcommit NUMBER; >> BEGIN >> maxcommit := 10000; >> >> FOR i IN 1..1000000 LOOP >> INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i, >> 'John' || to_char(i), 'Smith' || to_char(i)); >> IF MOD(i, maxcommit) = 0 THEN >> COMMIT; >> END IF; >> END LOOP; >> >> COMMIT; >> END; >> >> >> >> -- >> http://www.wiesinger.com/ >> >> >> -- >> Sent via pgsql-general mailing list (pgsql-general@postgresql.org) >> To make changes to your subscription: >> http://www.postgresql.org/mailpref/pgsql-general >> > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general >
Hello, Aren't there any drawbacks in postgrs on such large transaction (like in Oracle), e.g if I would use 500.000.000 or even more? Ciao, Gerhard -- http://www.wiesinger.com/ On Fri, 26 Dec 2008, Pavel Stehule wrote: > Hello > > why do you need commit? > > pavel > > 2008/12/26 Gerhard Wiesinger <lists@wiesinger.com>: >> Hello! >> >> I tried the following, but still one transaction: >> >> SELECT insert_1Mio(); >> >> (parallel select count(id) from employee; is done) >> >> CREATE OR REPLACE FUNCTION insert_some(start_i INTEGER, end_i INTEGER) >> RETURNS void >> AS $func$ >> DECLARE >> BEGIN >> FOR i IN start_i..end_i LOOP >> INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i, >> 'John' || i, 'Smith' || i); >> END LOOP; >> END; >> $func$ LANGUAGE plpgsql; >> >> CREATE OR REPLACE FUNCTION insert_1Mio() RETURNS void >> AS $func$ >> DECLARE >> maxcommit INTEGER; >> start_i INTEGER; >> end_i INTEGER; >> now_i INTEGER; >> BEGIN >> maxcommit := 10000; >> start_i :=1; >> end_i := 1000000; >> >> now_i := start_i; >> >> FOR i IN start_i..end_i LOOP >> IF MOD(i, maxcommit) = 0 THEN >> PERFORM insert_some(now_i, i); >> now_i := i + 1; >> END IF; >> END LOOP; >> PERFORM insert_some(now_i, end_i); >> END; >> $func$ LANGUAGE plpgsql; >> >> Any ideas? >> >> Ciao, >> Gerhard >> >> -- >> http://www.wiesinger.com/ >> >> >> On Thu, 25 Dec 2008, Gerhard Wiesinger wrote: >> >>> Hello! >>> >>> I want to translate the following Oracle PL/SQL script into plpgsql. >>> Especially I'm having problems with the transaction thing. i tried START >>> TRANSACTION and COMMIT without success. >>> >>> Any ideas? >>> >>> Thanx. >>> >>> Ciao, >>> Gerhard >>> >>> CREATE OR REPLACE PROCEDURE insert_1Mio >>> IS >>> maxcommit NUMBER; >>> BEGIN >>> maxcommit := 10000; >>> >>> FOR i IN 1..1000000 LOOP >>> INSERT INTO employee (id, department, firstname, lastname) VALUES (i, i, >>> 'John' || to_char(i), 'Smith' || to_char(i)); >>> IF MOD(i, maxcommit) = 0 THEN >>> COMMIT; >>> END IF; >>> END LOOP; >>> >>> COMMIT; >>> END; >>> >>> >>> >>> -- >>> http://www.wiesinger.com/ >>> >>> >>> -- >>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org) >>> To make changes to your subscription: >>> http://www.postgresql.org/mailpref/pgsql-general >>> >> >> -- >> Sent via pgsql-general mailing list (pgsql-general@postgresql.org) >> To make changes to your subscription: >> http://www.postgresql.org/mailpref/pgsql-general >> > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general >
2008/12/26 Gerhard Wiesinger <lists@wiesinger.com>: > Hello, > > Aren't there any drawbacks in postgrs on such large transaction (like in > Oracle), e.g if I would use 500.000.000 or even more? for insert no Regards Pavel > > Ciao, > Gerhard > > -- > http://www.wiesinger.com/ > > > On Fri, 26 Dec 2008, Pavel Stehule wrote: > >> Hello >> >> why do you need commit? >> >> pavel >> >> 2008/12/26 Gerhard Wiesinger <lists@wiesinger.com>: >>> >>> Hello! >>> >>> I tried the following, but still one transaction: >>> >>> SELECT insert_1Mio(); >>> >>> (parallel select count(id) from employee; is done) >>> >>> CREATE OR REPLACE FUNCTION insert_some(start_i INTEGER, end_i INTEGER) >>> RETURNS void >>> AS $func$ >>> DECLARE >>> BEGIN >>> FOR i IN start_i..end_i LOOP >>> INSERT INTO employee (id, department, firstname, lastname) VALUES (i, >>> i, >>> 'John' || i, 'Smith' || i); >>> END LOOP; >>> END; >>> $func$ LANGUAGE plpgsql; >>> >>> CREATE OR REPLACE FUNCTION insert_1Mio() RETURNS void >>> AS $func$ >>> DECLARE >>> maxcommit INTEGER; >>> start_i INTEGER; >>> end_i INTEGER; >>> now_i INTEGER; >>> BEGIN >>> maxcommit := 10000; >>> start_i :=1; >>> end_i := 1000000; >>> >>> now_i := start_i; >>> >>> FOR i IN start_i..end_i LOOP >>> IF MOD(i, maxcommit) = 0 THEN >>> PERFORM insert_some(now_i, i); >>> now_i := i + 1; >>> END IF; >>> END LOOP; >>> PERFORM insert_some(now_i, end_i); >>> END; >>> $func$ LANGUAGE plpgsql; >>> >>> Any ideas? >>> >>> Ciao, >>> Gerhard >>> >>> -- >>> http://www.wiesinger.com/ >>> >>> >>> On Thu, 25 Dec 2008, Gerhard Wiesinger wrote: >>> >>>> Hello! >>>> >>>> I want to translate the following Oracle PL/SQL script into plpgsql. >>>> Especially I'm having problems with the transaction thing. i tried START >>>> TRANSACTION and COMMIT without success. >>>> >>>> Any ideas? >>>> >>>> Thanx. >>>> >>>> Ciao, >>>> Gerhard >>>> >>>> CREATE OR REPLACE PROCEDURE insert_1Mio >>>> IS >>>> maxcommit NUMBER; >>>> BEGIN >>>> maxcommit := 10000; >>>> >>>> FOR i IN 1..1000000 LOOP >>>> INSERT INTO employee (id, department, firstname, lastname) VALUES (i, >>>> i, >>>> 'John' || to_char(i), 'Smith' || to_char(i)); >>>> IF MOD(i, maxcommit) = 0 THEN >>>> COMMIT; >>>> END IF; >>>> END LOOP; >>>> >>>> COMMIT; >>>> END; >>>> >>>> >>>> >>>> -- >>>> http://www.wiesinger.com/ >>>> >>>> >>>> -- >>>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org) >>>> To make changes to your subscription: >>>> http://www.postgresql.org/mailpref/pgsql-general >>>> >>> >>> -- >>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org) >>> To make changes to your subscription: >>> http://www.postgresql.org/mailpref/pgsql-general >>> >> >> -- >> Sent via pgsql-general mailing list (pgsql-general@postgresql.org) >> To make changes to your subscription: >> http://www.postgresql.org/mailpref/pgsql-general >> >