paginate very slow on large queries with :group
Reported by Michael Ragalie | December 10th, 2008 @ 03:37 AM
In finder.rb, wp_count() passes off to count() in order to figure out how many total results exist. When :group is specified, count() uses execute_grouped_calculation() in ActiveRecord::Calculations, which calls ActiveSupport::OrderedHash[]= . ActiveSupport::OrderedHash[]= calls assoc() on the its internal Array, which compares the value passed to assoc() to the first value of each array within its internal Array. As a result, for my application, which has a total of 2,895 matching rows, a total of 4,189,065 == comparisons are made in the course of determining the number of rows.
This is obviously very slow. Is there be a faster way to calculate the number of rows for queries with :group?
Comments and changes to this ticket
-
Mislav December 11th, 2008 @ 11:45 PM
- State changed from new to open
That's rather unfortunate.
Does this help?
Model.paginate :page => 1, :per_page => 10, :group => 'foo', :count => { :group => nil }
That will cause the count to be performed like the
:group
option wasn't even there. -
Michael Ragalie December 12th, 2008 @ 12:57 AM
That worked like a charm. All I did was use
Model.paginate :page => 1, :per_page => 10, :group => 'foo.id', :count => {:group => nil, :select => "DISTINCT foo.id"}
and got the expected behavior.
Thanks for your help!
-
Sebastian February 6th, 2009 @ 12:12 AM
I*m sorry. But I think this is absolutly wrong, and will return wrong results.
When you group something by a specific value, and then count without the group option as described above you'll get the count of all ungrouped results.
I don't know about a better workaround to speed things up.
-
Mislav February 6th, 2009 @ 01:32 AM
You may be right.
But still, little can be done from will_paginate. Maybe you guys should open a Rails ticket? On the other hand, the internal implementation of OrderedHash was rewritten and now the problem may be gone (better check to be sure)
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile ยป
Everyone's favorite Ruby library for pagination of practically anything!