It's much faster (usually) if you prepare once using placeholders
and execute using bind parameters.  

As a psuedo-code example;

my $sql = "INSERT into FOO (name, address, phone) VALUES (?, ?, ?)";
my $sth = $dbh->prepare($sql);
my ($name, $address, $phone);

while (<whatever)
{
    ($name, $address, $phone) = <whatever>;
    $sth->execute($name, $address, $phone);
}

Your example is more complicated so you'll have some reading to do.
But that's the basic model.

----
Steve Sapovits
Global Sports Interactive
Work Email: [EMAIL PROTECTED]
Home Email: [EMAIL PROTECTED]
Work Phone: 610-491-7087
Cell:       610-574-7706
Pager:      877-239-4003

> -----Original Message-----
> From: Greg Wardawy [SMTP:[EMAIL PROTECTED]]
> Sent: Friday, June 15, 2001 12:34 PM
> To:   [EMAIL PROTECTED]
> Subject:      How can I speed it up?
> 
> Hello all,
> 
> I'm just new to DBI, it's my first working DBI script so please don't
> laugh too hard at me. The script below works fine (AFAIK) but is slow -
> inserting 100000 records into the table takes ~1 hour 20 minutes. I think
> that's because I placed $sth = $dbh->prepare in the while loop inside the
> for block. I tried to place it outside the for block but some data was
> missing and some wasn't correct.  How can I improve my script? How can I
> speed it up? Any advice, any comment and any information are greatly
> appreciated.
> TIA
> Greg
> 
> Here goes my script:
> 
> #########################
> #!perl
> 
> use strict;
> #use Date::Format;
> use DBI;
> use diagnostics;
> 
> my $dir = "G:\\apps\\quickedi\\ib";
> my $recv_file = "padrecv.1";
> my $elite_file = "item_upc.txt";
> 
> print "Poczekaj chwile..............\n";
> open(ITEMUPC, "> $dir/$elite_file ")          || die "can't create
> $dir/$elite_file: $!";
> 
> my %upc_itemlist;
> my %item_upclist;
> my ($upc_num,$item_num);
> 
> my $DSN = "Elite";
> 
> my $dbh1 = DBI->connect ("dbi:ODBC:$DSN", "rpt_user", "",
> {RaiseError => 1, AutoCommit => 0});
> 
> my $SQL = $dbh1->prepare("select upc, item_num from item where org_code =
> '01' and item_num = report_item_num and memo_1 <> 'TITLE' and upc is not
> null and upc <> 'NONE' order by upc");
> $SQL->execute;
> while ( my @row = $SQL->fetchrow_array) {
>       my($upc_num,$item,$price) = @row;
>       ($upc_num = $upc_num) =~
> s/^(\d)\s(\d{5})\s(\d{5})\s(\d)|^(\d)(\d{5})(\d{5})(\d)\s{3}/$1$2$3$4/;
>       ($item =$item) =~ s/\s+$//;
>       print ITEMUPC "$upc_num,$item\n";
> }
> 
> $dbh1->disconnect;
> close ITEMUPC;
> 
> open(CHECK, "< $dir/$elite_file");
> 
> while (<CHECK>) {
> chomp;
> 
>       ($upc_num, $item_num) = split /\s*,\s*/;
>       $upc_itemlist{$upc_num} = $item_num;
> 
> }
> 
> close CHECK;
> 
> my $dbh = DBI->connect( "dbi:ODBC:EDI Data", "", "" )or die "Can't connect
> to ODBC database: $DBI::errstr\n";
> open(RECV, "< $dir/$recv_file")               || die "can't open
> $recv_file: $_!";
> 
> my @names =
> qq(customer,upc_num,item_num,store_num,activity,quantity,beginning_date,en
> ding_date);
> my ($count,$customer,$pad_num,$upc,$xq02,$xq03,$za01);
> 
> while (<RECV>) {
> no warnings 'uninitialized';
>               s/QA/Current Inventory/;
>               s/QS/Net Quantity Sold/;
>               s/.$//; 
> 
> chomp;
>  my @fields = split /\</;
>  
>       if (/^ISA<00<          <00<          <12<2017781300/) {
>               $customer = "LNT";
>       } elsif (/^GS<PD<2017781300/) {
>               #ignore
>       } elsif (/^ST<852/) {
>               $pad_num = $fields[2];
>       } elsif (/^XQ/) {
>               my @fields = split /\</;
>               ($xq02 = $fields[2]) =~ s/(\d{4})(\d{2})(\d{2})/$2\/$3\/$1/;
> #Begining Date Range
>               ($xq03 = $fields[3]) =~ s/(\d{4})(\d{2})(\d{2})/$2\/$3\/$1/;
> #Ending Date Range
>       } elsif (/^N9/) {
>               #ignore
>       } elsif (/^LIN/) {
>               $upc = $fields[3];      #UPC number
>       } elsif (/^ZA/) {
>               $za01 = $fields[1]; #QA = Current Inventory Qty, QS = Net
> Qty Sold
>       } elsif (/^SDQ/) {
>               $upc_itemlist{$upc} = "NO_ELITE_ITEM_NUM_FOR_LNT_UPC" if
> length($upc_itemlist{$upc}) == 0;
>               my @sdq = split/\</;
>               for (my $i=3;$i<=21;$i+=2) {
>                       if (defined $pad_num) { # because other transactions
> also have a SDQ lines
>                       if (defined $sdq[$i]) { # some SDQ lines have less
> then 22 fields
>                       $count++;
>                       my $sth = $dbh->prepare("INSERT INTO edi_pad
> (@names) VALUES
> ('$customer','$upc','$upc_itemlist{$upc}','$sdq[$i]','$za01','$sdq[$i+1]',
> '$xq02','$xq03')");           
>                               print  "Processing
> $count:\t$pad_num,$upc,$sdq[$i],$sdq[$i+1]\n";
>                               $sth->execute or die "can't execute SQL
> statement: $DBI::errstr\n";
> 
>                               } else {
>                                       #ignore
>                               }
>                               } else {
>                                       #ignore
>                               }
>       }
> 
>       } elsif (/^CTT/) {
>               #ignore
>       } elsif (/^SE/) {
>               #ignore
>       } elsif (/^GE/) {
>               #ignore
>       } elsif (/^IEA/) {
>               next unless (/^GS<PD<2017781300/);
>       } else {
>               print "Unrecognized: ", substr ($_, 0, 10), "\n";
>       }
> }
> close RECV;
> $dbh->disconnect;
> 
> #######################
> 
> and the part of the input file:
> 
> ISA<00<          <00<          <12<2017781300     <12<7084061572
> <010611<0537<U<00401<000000588<0<P<: 
> GS<PD<2017781300<7084061572<20010611<0537<588<X<004010VICS 
> ST<852<5880001 
> XQ<H<20010603<20010609 
> N9<IA<1982 
> LIN<<UP<009281020035 
> ZA<QA 
> SDQ<EA<92<129<5<183<25<187<9<191<9<194<7<206<6<288<16<302<9<305<4<320<30 
> SDQ<EA<92<329<5<338<6<342<6<346<7<347<8<348<7<350<5<351<5<354<17<355<6 
> SDQ<EA<92<358<8<359<7<360<8<362<14<363<8<364<7<365<12<367<11<368<3<369<5 
> SDQ<EA<92<370<7<371<6<372<6<373<11<374<9<375<17<376<10<377<7<378<-2<379<6 
> ZA<QS 
> SDQ<EA<92<129<2<187<1<206<1<371<1<387<1<391<1<398<1<400<1<403<1<425<1 
> SDQ<EA<92<429<1<440<2<441<2<442<1<444<1<446<1<454<1<463<2<470<1<476<1 
> SDQ<EA<92<478<2<479<1<480<1<483<1<487<1<494<1<498<1<505<1<512<2<514<1 
> SDQ<EA<92<525<1<528<1<534<1<541<2<549<1<552<1<554<1<562<1<575<1<585<1 
> SDQ<EA<92<593<1<598<1<616<1<620<2<625<1<627<1<633<2 
> LIN<<UP<009281021315 
> ZA<QA 
> SDQ<EA<92<305<31<320<-3<338<2<346<31<348<95<354<31<355<-2<360<37<373<102<3
> 74<9 
> SDQ<EA<92<377<77<379<-6<381<49<382<2<386<54<390<89<392<84<399<7<402<-5<405
> <6 
> SDQ<EA<92<409<74<421<90<425<-1<431<2<437<-3<441<59<462<210<468<18<480<9<49
> 4<1 
> SDQ<EA<92<495<17<502<-1<515<82<523<1<526<-1<527<101<536<9<552<92<555<2<564
> <-1 
> SDQ<EA<92<574<58<581<109<586<12<601<16<609<2<616<30<632<1<646<5<654<-2<673
> <4 
> ZA<QS 
> SDQ<EA<92<346<1<360<1<381<1<399<1<436<1<437<1<495<1<515<2<564<1<574<1 
> CTT<698 
> SE<8943<5880001 
> GE<1<588 
> IEA<1<000000588 
> 

Reply via email to