Peter -

Sorry for the delay, I just now had time to get to this.  It looks good!  I've 
included the generated SQL below so you can confirm that we're getting what 
you're expecting.  FYI, I ran the sql through the query analyzer and the new 
SQL is *much* more efficient.

Many Thanks!

- Alan


my $items = $schema->resultset('Birds')->search(
{},
{order_by => {'-asc' => 'common_name'},
unsafe_subselect_ok => 1,
prefetch => [qw/genus species/],
page => 4,
rows => 10}
);

OLD:
SELECT me.id, me.genus_id, me.species_name_id, me.image_id, 
me.north_america_map_id, me.washington_map_id, me.default_sound_id, 
me.is_washington_bird, me.common_name, me.taxonomic_order, me.identification, 
me.voice, me.habitat, me.behavior, me.diet, me.nesting, me.migration, 
me.where_found, me.conservation_status, me.breeding, me.notes, genus.id, 
genus.family_id, genus.genus_scientific_name, genus.genus_common_name, 
genus.genus_description, species.id, species.species_scientific_name, 
species.species_name_notes FROM ( SELECT me.id, me.genus_id, 
me.species_name_id, me.image_id, me.north_america_map_id, me.washington_map_id, 
me.default_sound_id, me.is_washington_bird, me.common_name, me.taxonomic_order, 
me.identification, me.voice, me.habitat, me.behavior, me.diet, me.nesting, 
me.migration, me.where_found, me.conservation_status, me.breeding, me.notes 
FROM ( SELECT me.*, ROW_NUMBER() OVER( ORDER BY (SELECT(1)) ) AS 
rno__row__index FROM ( SELECT me.id, me.genus_id, me.species_name_id, 
me.image_id, me.north_america_map_id, me.washington_map_id, 
me.default_sound_id, me.is_washington_bird, me.common_name, me.taxonomic_order, 
me.identification, me.voice, me.habitat, me.behavior, me.diet, me.nesting, 
me.migration, me.where_found, me.conservation_status, me.breeding, me.notes 
FROM (SELECT TOP 4294967296 me.id, me.genus_id, me.species_name_id, 
me.image_id, me.north_america_map_id, me.washington_map_id, 
me.default_sound_id, me.is_washington_bird, me.common_name, me.taxonomic_order, 
me.identification, me.voice, me.habitat, me.behavior, me.diet, me.nesting, 
me.migration, me.where_found, me.conservation_status, me.breeding, me.notes 
FROM birds me JOIN genera genus ON genus.id = me.genus_id JOIN species_names 
species ON species.id = me.species_name_id ORDER BY common_name ASC) me ) me ) 
me WHERE rno__row__index BETWEEN 31 AND 40 ) me JOIN genera genus ON genus.id = 
me.genus_id JOIN species_names species ON species.id = me.species_name_id ORDER 
BY common_name ASC:


NEW:
SELECT id, genus_id, species_name_id, image_id, north_america_map_id, 
washington_map_id, default_sound_id, is_washington_bird, common_name, 
taxonomic_order, identification, voice, habitat, behavior, diet, nesting, 
migration, where_found, conservation_status, breeding, notes, genus__id, 
genus__family_id, genus__genus_scientific_name, genus__genus_common_name, 
genus__genus_description, species__id, species__species_scientific_name, 
species__species_name_notes FROM ( SELECT id, genus_id, species_name_id, 
image_id, north_america_map_id, washington_map_id, default_sound_id, 
is_washington_bird, common_name, taxonomic_order, identification, voice, 
habitat, behavior, diet, nesting, migration, where_found, conservation_status, 
breeding, notes, genus__id, genus__family_id, genus__genus_scientific_name, 
genus__genus_common_name, genus__genus_description, species__id, 
species__species_scientific_name, species__species_name_notes, ORDER__BY__1, 
ROW_NUMBER() OVER( ORDER BY ORDER__BY__1 ASC ) AS rno__row__index FROM ( SELECT 
me.id, me.genus_id, me.species_name_id, me.image_id, me.north_america_map_id, 
me.washington_map_id, me.default_sound_id, me.is_washington_bird, 
me.common_name, me.taxonomic_order, me.identification, me.voice, me.habitat, 
me.behavior, me.diet, me.nesting, me.migration, me.where_found, 
me.conservation_status, me.breeding, me.notes, genus.id AS genus__id, 
genus.family_id AS genus__family_id, genus.genus_scientific_name AS 
genus__genus_scientific_name, genus.genus_common_name AS 
genus__genus_common_name, genus.genus_description AS genus__genus_description, 
species.id AS species__id, species.species_scientific_name AS 
species__species_scientific_name, species.species_name_notes AS 
species__species_name_notes, common_name AS ORDER__BY__1 FROM birds me JOIN 
genera genus ON genus.id = me.genus_id JOIN species_names species ON species.id 
= me.species_name_id ) me ) me WHERE rno__row__index BETWEEN 31 AND 40 :

> -----Original Message-----
> From: Peter Rabbitson [mailto:[email protected]]
> Sent: Wednesday, May 05, 2010 3:35 AM
> To: DBIx::Class user and developer list
> Subject: Re: [Dbix-class] fate of mssql_limit_regression branch?
> 
> Alan Humphrey wrote:
> > I've installed the trunk code and, for my purposes, the
> unsafe_subselect_ok attribute is probably going to be sufficient.
> Thank you for your thorough documentation.
> >
> 
> Hi,
> 
> Waking up this old thread to get some of your testing input. A thorough
> rewrite[1] of the subselecting limit emulations has just landed in
> trunk[2] and *in theory* it should allow you to get rid of almost all
> unsafe_subselect_ok flags in your code (as the queries now changed to
> include much less subqueries to arrive at the same result). Please test
> if time permits, before this lands on CPAN. Your input is appreciated!
> 
> Cheers
> 
> [1] http://dev.catalystframework.org/svnweb/bast/revision?rev=9305
> [2] http://dev.catalyst.perl.org/repos/bast/DBIx-Class/0.08/trunk/
> 
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive: http://www.grokbase.com/group/dbix-
> [email protected]


_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/[email protected]

Reply via email to