[Dbix-class] Prefetch question

Peter Rabbitson rabbit+dbic at rabbit.us
Wed Dec 16 19:47:24 GMT 2009


Bill Moseley wrote:
> 
> 
> On Wed, Dec 16, 2009 at 8:43 AM, Bernhard Graf <dbic4 at augensalat.de
> <mailto:dbic4 at augensalat.de>> wrote:
> 
>     Prefetching is a convenient thing, but may also need a lot of resources.
> 
>     E.g. I have a users table, that belongs_to("country"). Table 'country'
>     has more information (e.g. full name, int. phone code, time zones, etc).
> 
>     The users table may have zillions of rows, whereas the the country table
>     is quite small (and nearly all users belong to a handful of countries).
> 
> 
>     With prefetching I get the same country data over and over again.
>     Without prefetching DBIC delays country fetches until I access
>     $user->country, but then also fetches the same country data all the
>     time.
> 
>     Is it possible not to prefetch country, but tell DBIC to cache delayed
>     fetches of related data, so that each related country row is really only
>     fetched once for this user resultset?
> 
> 
> Isn't this what Class::DBI attempted to do with it's object index?  That
> is, if it needed to fetch $user->county but that $country had already
> been fetched then it used the in-memory copy.  I always disabled that
> feature as it seems to cause more breakage than not.
> 
> I assume you are fetching a page of users to display?   Say 20 rows? I'd
> be interested to see a benchmark between doing it in one query (with
> prefetch) and then one query and then twenty additional queries to fetch
> each country.

Moreover paged prefetch now works correctly.



More information about the DBIx-Class mailing list