On 09/12/2010 10:37 AM, ericbamba...@discover.com wrote:
Sounds odd really We will have to know the version of DBD::Oracle and DBI for starters Send me the output from the dbd_verbose=>15 so I can check a few things cheers John
DBI Users, I'm having trouble with DBD::Oracle and very simple insert statements into tables with less than 200 records only 2 FKs and no indexes taking over 4 seconds. Inserts to other tables seem unaffected. I can run the exact same statement from SQLPlus or SQL Developer with no speed issues. It is lightning quick unless I use my perl code. The exact same issue presents itself whether I use $dbh->do() or a traditional prepare/execute. Does anyone know why only DBD::Oracle would have trouble? It looks like it hangs in the driver on OCIStmtExecute_log_stat but I cant be 100%. Something wacky is happening in the interaction between the driver and server. The issue is in $sth->execute(). My timing from just that part shows about 4-5 seconds consistently. It happens each and every query. Almost my exact issue seems to have been covered before on a slightly different DB version but no answer was posted: http://www.nntp.perl.org/group/perl.dbi.users/2006/11/msg30473.html Please help me troubleshoot this issue and let me know if I can provide any more information to the group. Here is the perl code I'm using. my $fs_store_q = "INSERT INTO FL_SYS_STAT_HIST (ABI_FMT_ID,DATA_COLL_ID,WRK_SPCE_FREE_KB_CNT,WRK_SPCE_USE_KB_CNT) VALUES ( ?,?,?,?)"; my $fs_sth; $s->{_dbh}->{ora_verbose} = 6; $s->{_dbh}->trace(6); unless($fs_sth = $s->{_dbh}->prepare($fs_store_q,)){ carp("Can't prepare stmt: $DBI::errstr\n"); return undef; }; foreach(@{$s->{workspaces}}){ $fs_sth->bind_param(1,$_->get_id(),SQL_INTEGER); $fs_sth->bind_param(2,$s->{id},SQL_INTEGER); $fs_sth->bind_param(3,$_->get_free_space(),SQL_INTEGER); $fs_sth->bind_param(4,$_->get_used_space(),SQL_INTEGER); $start = time(); unless($fs_sth->execute()){ carp("Can't execute stmt: $DBI::errstr\n"); return undef; }; $end = time(); $s->{_dbh}->{ora_verbose} = 0; print STDERR "STORE TOOK ".($end-$start)." seconds\n"; } $ sqlplus mjmc_u...@db30 SQL*Plus: Release 11.2.0.1.0 Production on Thu Dec 9 10:20:13 2010 Copyright (c) 1982, 2009, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select * from v$version where banner like 'Oracle%'; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production The table and insert statement are dead simple. Here they are. Sorry about the lengthy DDL its autogenerated. INSERT INTO FL_SYS_STAT_HIST (ABI_FMT_ID,DATA_COLL_ID,WRK_SPCE_FREE_KB_CNT,WRK_SPCE_USE_KB_CNT) VALUES (1,28990,0,0); CREATE TABLE MJMC.FL_SYS_STAT_HIST ( ABI_FMT_ID NUMBER(5) NOT NULL, DATA_COLL_ID NUMBER(10) NOT NULL, WRK_SPCE_FREE_KB_CNT NUMBER(15) NULL, WRK_SPCE_USE_KB_CNT NUMBER(15) NULL ) TABLESPACE MJMC_D_01 LOGGING STORAGE(BUFFER_POOL DEFAULT) NOPARALLEL NOCACHE ALTER TABLE MJMC.FL_SYS_STAT_HIST ADD CONSTRAINT FL_SYS_STAT_HIST_PK PRIMARY KEY (ABI_FMT_ID,DATA_COLL_ID) USING INDEX TABLESPACE MJMC_X_01 STORAGE(BUFFER_POOL DEFAULT) ENABLE VALIDATE CREATE INDEX MJMC.FL_SYS_STAT_HIST_FK1_X ON MJMC.FL_SYS_STAT_HIST(ABI_FMT_ID) TABLESPACE MJMC_X_01 STORAGE(BUFFER_POOL DEFAULT) NOPARALLEL NOCOMPRESS / CREATE INDEX MJMC.FL_SYS_STAT_HIST_FK2_X ON MJMC.FL_SYS_STAT_HIST(DATA_COLL_ID) TABLESPACE MJMC_X_01 STORAGE(BUFFER_POOL DEFAULT) NOPARALLEL NOCOMPRESS ALTER TABLE MJMC.FL_SYS_STAT_HIST ADD CONSTRAINT FL_SYS_STAT_HIST_FK1 FOREIGN KEY (ABI_FMT_ID) REFERENCES MJMC.ABI_FL_SYS_FMT (ABI_FMT_ID) ENABLE / ALTER TABLE MJMC.FL_SYS_STAT_HIST ADD CONSTRAINT FL_SYS_STAT_HIST_FK2 FOREIGN KEY (DATA_COLL_ID) REFERENCES MJMC.NDE_DATA_HIST (DATA_COLL_ID) ENABLE The attached trace should show 2 inserts and then I called die() otherwise the program is designed to run forever in a loop. Please consider the environment before printing this email.