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.

Reply via email to