Re: Please help - tks - Mailing list pgsql-admin
From | Brian McCane |
---|---|
Subject | Re: Please help - tks |
Date | |
Msg-id | 20011019093709.G71650-100000@fw.mccons.net Whole thread Raw |
In response to | Re: Please help - tks (Brett Schwarz <brett_schwarz@yahoo.com>) |
Responses |
Re: Please help - tks
|
List | pgsql-admin |
Brett, It appears that I may have upset you somehow. I didn't intend to. I chose to write the PERL script to place them in a transaction to help improve performance a little bit on each pass. By building and tearing down a connection to the postmaster everytime you send an update, you will be putting a much heavier load on the server than is necessary. If I was using the script myself, I would make the connection to the postmaster once at the top of the script, and then re-use it with a transaction block for each group of 10/20. Then shut it down at the end. This way I do not suffer any additional protocol overhead each time I want to use it. - brian On Thu, 18 Oct 2001, Brett Schwarz wrote: > ???? > > This is why I said this: > > > adjust the sleep to your own specs. > > If he wants to "batch" them, then all he needs to do is add a condition/count: > > -------------------------------- > #!/bin/sh > > cnt=1 > while read line; do > > # "batches" of 20 or whatever you *want* > if [ "X$cnt" == "X20" ]; then > sleep 5 # whatever you *want* > cnt=0 > fi > > psql dbname -c "UPDATE ... $line ..." > let cnt=$cnt+1 > > done < filename > > --------------------------------- > > I will leave it up to the reader to modify this to his/her *specific* need... > > --brett > > > > > On Thu, 18 Oct 2001 20:07:32 -0500 (CDT) > Brian McCane <bmccane@mccons.net> wrote: > > > Much too quick and dirty. With 300,000 updates this will take 1.5million > > seconds, roughly 200 days. Even at a rate of 1 a second it will take > > nearly four days. All this aside, I would probably use a perl script and > > do batches of about 10-20, with a sleep. You can try something like the > > following and feed it using standard input. Please NOTE, I didn't test > > this, and even if I did, you shouldn't trust me :). > > > > - brian > > > > Wm. Brian McCane | Life is full of doors that won't open > > Search http://recall.maxbaud.net/ | when you knock, equally spaced amid those > > Usenet http://freenews.maxbaud.net/ | that open when you don't want them to. > > Auction http://www.sellit-here.com/ | - Roger Zelazny "Blood of Amber" > > > > #! /usr/bin/perl > > > > use strict ; > > > > my @updates ; > > > > while (my $line = <STDIN>) > > { > > my $cmd = "UPDATE table SET ......." ; # Use the line we just read > > push(@updates, $cmd) ; > > if (@updates == 10) > > { > > do_update() ; > > sleep 5 ; > > @updates = () ; # Redundant > > } > > } > > do_update if (@updates) ; > > > > sub do_update > > { > > open PSQL, "| psql dbname" ; > > print PSQL "begin transaction ;\n" ; > > while (my $cmd = shift @updates) > > { > > print PSQL $cmd . "\n" ; > > } > > print PSQL "commit ;\n" ; > > close PSQL ; > > } > > > > __END__ > > > > > > On Thu, 18 Oct 2001, Brett Schwarz wrote: > > > > > A quick and dirty solution would be something like (untested): > > > > > > while read line; do > > > psql dbname -c "update table ... use 'line' as your id and data" > > > sleep 5 > > > done < filename > > > > > > where "filename" is the file with the ids in it. "dbname" is the name of your DB (of course!) > > > > > > I am not sure what your file looks like, but you can do something like this. It could be easy, or harder, dependingon what your file has. > > > > > > adjust the sleep to your own specs. > > > > > > --brett > > > > > > > > > P.S. > > > > > > You could test this out by doing: > > > > > > while read line; do > > > psql dbname -c "select * from table where id=$line" > > > sleep 5 > > > done < filename > > > > > > > > > > > > On Thu, 18 Oct 2001 16:35:01 +1000 (EST) > > > Mr OCP <mr_ocp@yahoo.com> wrote: > > > > > > > Hi Folks > > > > > > > > We have about 300,000 records to update, I have > > > > created a file with the ids of the records to be > > > > updated, since the number of records to be updated is > > > > very large, the update statement takes forever and > > > > server slows down dramatically, therefore I want to do > > > > one at a time. > > > > > > > > Do you guys have any script which may update records > > > > one by one using the file that lists these records. I > > > > am running postgresql sever under Unix, any kind of > > > > script would do, whether its a perl, bash or sql > > > > whatever script > > > > > > > > Thanks for your help > > > > Mike > > > > > > > > http://briefcase.yahoo.com.au - Yahoo! Briefcase > > > > - Manage your files online. > > > > > > > > ---------------------------(end of broadcast)--------------------------- > > > > TIP 5: Have you checked our extensive FAQ? > > > > > > > > http://www.postgresql.org/users-lounge/docs/faq.html > > > > > > _________________________________________________________ > > > Do You Yahoo!? > > > Get your free @yahoo.com address at http://mail.yahoo.com > > > > > > > > > ---------------------------(end of broadcast)--------------------------- > > > TIP 3: if posting/reading through Usenet, please send an appropriate > > > subscribe-nomail command to majordomo@postgresql.org so that your > > > message can get through to the mailing list cleanly > > > > > > > > > ---------------------------(end of broadcast)--------------------------- > > TIP 6: Have you searched our list archives? > > > > http://archives.postgresql.org > > _________________________________________________________ > Do You Yahoo!? > Get your free @yahoo.com address at http://mail.yahoo.com >
pgsql-admin by date: