Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Re: 10g Bind peeking causes multiple cursors for same query with perl DBD::Oracle
"peter" <p_msantos_at_yahoo.com> wrote in message
news:1133467903.157694.314450_at_f14g2000cwb.googlegroups.com...
> Dear all,
> I'm hoping to get some insight into why oracle creates 2 cursors for
> the same sql query when I execute a SELECT statement via my small
> little perl script. Here is what is happening .. My query uses 2 bind
> variables and when it is prepared oracle generates 1 cursor for my
> query. When I execute that prepared statement with actual input bind
> variables, it generates a 2nd cursor for the same query.
>
> The problem here is that during the prepare, oracle identifies my 2
> bind parameters are 2000 character bytes. When I actually execute the
> query with the binds, it calculates the bind parameters as 32
> characters. So because of bind peeking it thinks it's 2 different
> queries and generates 2 cursors...where the first cursor has
> executions=0.
>
> I can turn off bind peeking with the parameter
> "_optim_peek_user_binds", but then instead of just having a cursor
> mismatch on user_bind_peeking I have the mismatch on "bind_mismatch".
>
> Does anyone know how to get around this? This to me is a waste of
> shared pool resources..and we have lots of this happening in our
> database. I've asked oracle for help, but I'm getting nowhere...
>
> Here is the complete test case.
> My env: Solaris 8 - Oracle 10.1.0.4 DBI and DBD::Oracle
>
> TEST TABLE
> ===========
> CREATE TABLE PETER_T1 (column1 varchar2(10),column2
> varchar2(10),date_left date);
>
> insert into PETER_1 values('Fname','Lname',to_date('20051130 153015',
> 'YYYYMMDD HH24MISS');
> insert into PETER_1 values('Fname','Lname',to_date('20051130 203015',
> 'YYYYMMDD HH24MISS');
>
> PERL PROGRAM
> ==============
> #!/bin/perl
> use DBI;
> my $dbh = DBI->connect( 'dbi:Oracle:;mydb]', '[username]',
> '[password',)
> || die "Database connection not made: $DBI::errstr";
>
> my $date1 = "20051130";
> my $date2 = "20051130";
>
> my $sql = qq{SELECT /* TESTING */ column1,column2\nfrom PETER_T1\n};
> $sql .= qq{WHERE\ndate_left between to_date( :p1 , 'YYYYMMDD') and
> };
> $sql .= qq{to_date( :p2 || ' 235959', 'YYYYMMDD HH24MISS')};
>
> # prepare select query
> my $sth = $dbh->prepare($sql);
>
> $sth->bind_param(":p1",$date1);
> $sth->bind_param(":p2",$date2);
> $sth->execute();
>
> print "COLUMN1\tCOLUMN2\n";
> print "=======\t=======\n";
> $sth->bind_columns( \$column1, \$column2);
> while( $sth->fetch() ) {
> print "$column1\t$column2\n";
> }
> $dbh->disconnect;
> exit;
>
> So what I've noticed is that in the above statement, the prepare
> creates cursor1, while
> the execute() creates the 2nd cursor.
>
> The query returns only 2 rows, and here is what's in the database.
>
> << V$SQL >>
> HASH_VALUE|SQL_ID | ROWSP| EXECS| CHILD#|CHILD_ADDRESS |MODULE
>
> ----------|-------------|------|------|--------|----------------|---------
Can you reproduce with sqlplus? Maybe it is a problem with the way perl
makes calls to Oracle.
Jim
Received on Fri Dec 02 2005 - 09:22:06 CST
![]() |
![]() |