Recently as in several days ago and the delete finished in about 5 
minutes.

I'm not sure how that would affect DBD::Oracle and not my 2 other tools 
though.

Let me double check with my DBA about that table.




John Scoles <sco...@pythian.com> 
12/09/2010 11:13 AM

To
<ericbamba...@discover.com>
cc
<dbi-users@perl.org>, <martin.ev...@easysoft.com>
Subject
Re: DBD::Oracle dbd_st_execute slow speed






  On 09/12/2010 11:59 AM, ericbamba...@discover.com wrote:
> List,
>
>          I'm not sure if this is relevant but I recently loaded 2 
million
> rows into a parent table NDE_DATA_HIST then issued a DELETE FROM to 
delete
> all of the rows. I dont have access to TRUNCATE(). The table now has 
only
> about 200 rows. However, the 2 other tools are still fast, its just DBI
> that is slow so I dont think its related.
>
>
>
Ha! I very much think so. ;)

Most likely the index of the 2000000+ is still being updated

Rebuild the indexes and then get back to me

cheers
John

> "Martin J. Evans"<martin.ev...@easysoft.com>
> 12/09/2010 10:33 AM
>
> To
> <dbi-users@perl.org>
> cc
>
> Subject
> Re: DBD::Oracle dbd_st_execute slow speed
>
>
>
>
>
>
> On 09/12/10 15:37, ericbamba...@discover.com wrote:
>> 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);
> Not that I believe this is the source of your problem but I don't think
> DBD::Oracle knows what an SQL_INTEGER is:
>
> dbd_bind_ph(): bind :p1<== '6' (type 4 ((UNKNOWN SQL TYPECODE 4)))
>
> and might be better written as ora_type =>  SQLT_INT or leave the type 
off
> the bind.
>
> DBD::Oracle by defaults binds strings to parameters and I have seen 
Oracle
> get upset when it receives strings for another type where it basically
> ignores the index.
>
> When you are using sqlplus or sql developer or some_other_tool are they
> binding the parameter as DBD::Oracle does or are they just passing in 
the
> entire SQL e.g., there is a world of difference between:
>
> insert into mytable values(1,2,3)
>
> and
>
> prepare
>    insert into mytable values(?,?,?)
> bind params 1-3 as strings
> execute
>
> How long does it take if it is straight forward do method call with just
> SQL and no parameters?
>
>>      $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.
>>
> Martin





Please consider the environment before printing this email.


Reply via email to