It sounded like he was calling it for nearly every value he was inserting
into his SQL. A standard location for caching the type_info information
would probably also help those DBDs that are simulating placeholders.
--
Mac :})
** I normally forward private questions to the appropriate mail list. **
Give a hobbit a fish and he eats fish for a day.
Give a hobbit a ring and he eats fish for an age.
----- Original Message -----
From: "Tim Bunce" <[EMAIL PROTECTED]>
To: "Dean Kopesky" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Tuesday, July 03, 2001 12:46
Subject: Re: DBD::_::db::type_info() slow
> How many times was type_info() being called?
>
> Tim.
>
> On Mon, Jul 02, 2001 at 01:19:10PM -0500, Dean Kopesky wrote:
> > Hi!
> >
> > While testing an application that generates SQL based on data extracted
> > from a database, I noticed that almost 80% of the runtime was being
> > consumed by DBI::db::quote(). A significant portion of that was in
> > DBD::_::db::type_info(). By caching the results of type_info_all(),
which
> > type_info() calls repeatedly, and by memoizing type_info() itself, I was
> > able to speed it up 5x or so.
> >
> > I have appended the diffs to this message. (I don't know if defining
new
> > db handle attributes willy-nilly is the best way to cache these values,
but
> > it's the best thing I could think of.)
> >
> > -Dean Kopesky / Bridge Information Systems / [EMAIL PROTECTED]
> >
> >
> > *** DBI.pm Mon Jun 4 14:01:39 2001
> > --- DBI.pm.2 Mon Jul 2 13:07:53 2001
> > ***************
> > *** 1070,1079 ****
> >
> > sub type_info {
> > my ($dbh, $data_type) = @_;
> > - my $tia = $dbh->type_info_all;
> > - return unless @$tia;
> > - my $idx_hash = shift @$tia;
> >
> > my $dt_idx = $idx_hash->{DATA_TYPE} || $idx_hash->{data_type};
> > Carp::croak("type_info_all returned non-standard DATA_TYPE index value
($dt_idx != 1)")
> > if $dt_idx && $dt_idx != 1;
> > --- 1070,1087 ----
> >
> > sub type_info {
> > my ($dbh, $data_type) = @_;
> >
> > + my $ti_cache = $dbh->{'TypeInfoCache'};
> > + my $tia = $dbh->{'TypeInfoAllCache'};
> > + my $idx_hash = $dbh->{'IdxHashCache'};
> > +
> > + if ( ! $idx_hash ) {
> > + $dbh->{'TypeInfoCache'} = $ti_cache = {};
> > + $dbh->{'TypeInfoAllCache'} = $tia = $dbh->type_info_all;
> > + $dbh->{'IdxHashCache'} = $idx_hash = shift @$tia;
> > + }
> > + return unless $idx_hash;
> > +
> > my $dt_idx = $idx_hash->{DATA_TYPE} || $idx_hash->{data_type};
> > Carp::croak("type_info_all returned non-standard DATA_TYPE index value
($dt_idx != 1)")
> > if $dt_idx && $dt_idx != 1;
> > ***************
> > *** 1082,1087 ****
> > --- 1090,1099 ----
> > my @ti;
> > my @data_type_list = (ref $data_type) ? @$data_type : ($data_type);
> > foreach $data_type (@data_type_list) {
> > + if ( exists $ti_cache->{$data_type} ) {
> > + return $ti_cache->{$data_type}->[0] unless wantarray;
> > + return @{$ti_cache->{$data_type}};
> > + }
> > if (defined($data_type) && $data_type != DBI::SQL_ALL_TYPES()) {
> > push @ti, grep { $_->[$dt_idx] == $data_type } @$tia;
> > }
> > ***************
> > *** 1100,1105 ****
> > --- 1112,1120 ----
> > my @out = map {
> > my %h; @h{@idx_names} = @{$_}[ @idx_values ]; \%h;
> > } @ti;
> > +
> > + $ti_cache->{$data_type} = \@out;
> > +
> > return $out[0] unless wantarray;
> > return @out;
> > }