On 25-Jul-2006 Tim Bunce wrote:
> Use DBI::Profile to see where the time is being spent.

I got this working and could not see anything taking longer. However, on
further investigation of my logs I have found the reason why doing a
prepare_cached on "select LAST_INSERT_ID()" to mysql is a BAD thing to do.
It always returns the first id ever inserted. i.e.

insert into table1 values (val)
select LAST_INSERT_ID() returns 1
insert into table1 values (val)
select LAST_INSERT_ID() returns 1 (instead of 2)
etc

I see there is a warning about how you can get into trouble with prepare_cached
in the DBI pod. Perhaps it would be worth noting that there is also some SQL
you don't want to prepare_cached as it won't work properly - like this example.

Martin
--
Martin J. Evans
Easysoft Ltd, UK
http://www.easysoft.com


> Tim.
> 
> On Tue, Jul 25, 2006 at 06:35:59PM +0100, Martin J. Evans wrote:
>> I know this is one of those how long is a piece of string questions but
>> I cannot see any difference using prepare_cached with a remote mysql or
>> oracle database. I have code which does inserts/updates/selects - around
>> 20 - 30 different pieces of SQL and most of them are run between a 100
>> and 1000 times per file I process. When I process around 10 files it
>> takes around 4 minutes and this drops about 5s when using prepare_cached
>> (but I thought this was too small so was within the bounds of variance
>> running the same script multiple times anyway).
>> 
>> Most of the uses are like this:
>> 
>> my $sql = q/select column from table where column2 = ?/;
>> my $val = selectrow_array($sql, undef, $a_value);
>> 
>> where the select returns one row. I changed this to:
>> 
>> $s = $h->prepare_cached($sql);
>> $s->execute($a_value);
>> $val = $s->fetchrow_array;
>> $s->finish;
>> 
>> There is was specific change to prepare_cached which actually doubles
>> the time when run to mysql compared with using prepare:
>> 
>> select LAST_INSERT_ID();
>> 
>> Am I doing something wrong or are my expectations wrong. I had thought
>> using prepare_cached would shave a lot more than 5s in 240s off.
>> 
>> Has anyone got a concrete example of where prepare_cached is
>> significantly faster? or I am flogging a dead horse?
>> 
>> Martin
>> -- 
>> Martin J. Evans
>> Easysoft Limited
>> http://www.easysoft.com
>> 

Reply via email to