Thanks for the explanation Anthony.  Users with large datasets should be
aware of this.

Regards
Johann


On 7 October 2013 13:59, Anthony <abasta...@gmail.com> wrote:

> I don't think it's the grid specifically that's doing that. When the DAL
> does a query with limitby, if no orderby is specified, it automatically
> orders by the primary keys of the tables involved, I assume to ensure the
> same query returns the same results each time (especially important for
> pagination). There is an undocumented "orderby_on_limitby" argument of
> .select() that controls this behavior (it defaults to True).
>
> Anthony
>
>
> On Monday, October 7, 2013 6:41:54 AM UTC-4, Johann Spies wrote:
>>
>> This code in web2py:
>>
>> fields = [db.rissue.so, db.rissue.sn, db.rsubject.subject]
>>     query = ((db.rissue.id > 0)&
>>              (db.rsc_joern_link.rj_id == db.rissue.uuid)&
>>              (db.rsc_joern_link.sc_id == db.rsubject.uuid)
>>          )
>>     data = SQLFORM.grid(query,
>>                         fields = fields,
>>                         maxtextlength=120,
>>                         editable = False,
>>                         deletable = False)
>>
>> results in the following backend query:
>>
>> SELECT  rissue.so, rissue.sn, rsubject.subject,
>>
>>         rsc_joern_link.id
>> FROM rsc_joern_link, rissue, rsubject
>> WHERE (((rissue.id > 0)
>> AND (rsc_joern_link.rj_id = rissue.uuid))
>> AND (rsc_joern_link.sc_id = rsubject.uuid))
>>
>> ORDER BY rsc_joern_link.id, rissue.id, rsubject.id
>> LIMIT 20
>> OFFSET 0;
>>
>> which is not a serious problem when working with small datasets but the
>> added 'orderby' clause causes serious delays when when working with large
>> datasets.
>>
>> As a workaround I am nou using 'orderby = db.<table>.id  in all cases to
>> prevent web2py adding what I did not mean.
>>
>> On a small dataset (3543 records) the effect was:
>>
>> SELECT  rissue.so, rissue.sn, rsubject.subject, rsc_joern_link.id FROM 
>> rsc_joern_link, rissue, rsubject WHERE (((rissue.id > 0) AND 
>> (rsc_joern_link.rj_id = rissue.uuid)) AND (rsc_joern_link.sc_id = 
>> rsubject.uuid)) ORDER BY rissue.id LIMIT 20 OFFSET 0;
>>
>>
>>
>> 1.58ms (this was with my orderby)
>>
>> SELECT  rissue.so, rissue.sn, rsubject.subject, rsc_joern_link.id FROM 
>> rsc_joern_link, rissue, rsubject WHERE (((rissue.id > 0) AND 
>> (rsc_joern_link.rj_id = rissue.uuid)) AND (rsc_joern_link.sc_id = 
>> rsubject.uuid)) ORDER BY rsc_joern_link.id, rissue.id, rsubject.id LIMIT 20 
>> OFFSET 0;
>>
>> 6.66ms  (this was with web2py's interpretation of my query)
>>
>>
>> I have not tested this but I suspect the multiple field orderby's only
>> happens when joins are involved.
>>
>> Regards
>> Johann
>> --
>> Because experiencing your loyal love is better than life itself,
>> my lips will praise you.  (Psalm 63:3)
>>
>  --
> Resources:
> - http://web2py.com
> - http://web2py.com/book (Documentation)
> - http://github.com/web2py/web2py (Source code)
> - https://code.google.com/p/web2py/issues/list (Report Issues)
> ---
> You received this message because you are subscribed to the Google Groups
> "web2py-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to web2py+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>



-- 
Because experiencing your loyal love is better than life itself,
my lips will praise you.  (Psalm 63:3)

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to