It appears that you are seeing the parse done by DBD::Oracle
to describe the table.
Look at the DBI docs for ora_check_sql. Turn it off and
the extra parse should go away.
Jared
On Thu, 2005-12-08 at 11:00 -0500, Peter Santos wrote:
> Dear users,
> 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 as 2000 character bytes max.
> 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 a cursor 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 (version 1.48) and DBD::Oracle
> (version 1.6)
>
> **
>
> *TEST TABLE *
> ===========
> CREATE TABLE TEST_T1 (column1 varchar2(10),
> column2 varchar2(10),
> date_left date);
>
> insert into TEST_1 values('Fname','Lname',to_date('20051130
> 153015','YYYYMMDD HH24MISS');
> insert into TEST_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 column1,column2\nfrom TEST_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); *# generates cursor1*
>
> $sth->bind_param(":p1",$date1);
> $sth->bind_param(":p2",$date2);
> $sth->execute(); *# generates cursor2*
>
> print "COLUMN1\tCOLUMN2\n";
> print "=======\t=======\n";
> $sth->bind_columns( \$column1, \$column2);
> while( $sth->fetch() ) {
> print "$column1\t$column2\n";
>
> }
>
> $dbh->disconnect;
> exit;
>
> *Here is what's in the Oracle data dictionary*
>
> HASH_VALUE|SQL_ID | ROWSP| EXECS| CHILD#|CHILD_ADDRESS |MODULE
> ----------|-------------|------|------|--------|----------------|-----------------
> 3546516858|2jwh16z9q73bu| 0| 0|0
> |0000040144BD2140|[EMAIL PROTECTED]
> 3546516858|2jwh16z9q73bu| 2| 1|1
> |000004012CECAAF0|[EMAIL PROTECTED]
>
> ** So, 1 query and 2 representations of that same query in the database.
> The execute
> did not shared the cursor prepared by the prepare() call.
>
> SQL > select * from v$sql_shared_cursor where sql_id='2jwh16z9q73bu';
>
> CHILD_ADDRESS
> |CHILD#|U|S|O|O|S|L|S|E|B|P|I|S|T|A|B|D|L|T|R|I|I|R|L|I|O|S|M|*U*|T|
> ----------------|------|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
> 0000040144BD2140|0
> |N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|
> 000004012CECAAF0|1
> |N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|*Y*|N|
>
> SQL>select * from v$sql_bind_metadata where address in
> ('0000040144BD2140','000004012CECAAF0');
>
> *** This shows us that cursor1 had different bind variable metadata than
> cursor2
> which explains why they weren't shared.
>
> ADDRESS | POSITION| DATATYPE|MAX_LENGTH| ARRAY_LEN|BIND_NAME
> ----------------|----------|----------|----------|----------|---------
> 0000040144BD2140| 1| 1| 2000| 0|P1
> 0000040144BD2140| 2| 1| 2000| 0|P2
> 000004012CECAAF0| 1| 1| 32| 0|P1
> 000004012CECAAF0| 2| 1| 32| 0|P2
>
>