Hi Matt,

It's unlikely the problem lies with dictfetchall. The "small performance hit" 
mentioned by the docs probably refers to the fact that the function has a time 
complexity of (number of colulmns) * (number of rows). Since you're only 
getting 10 rows back, I can't see that having an appreciable impact.

I haven't seen this kind of variation between performing a direct query, and 
executing the query as part of a Django request… especially with such a basic 
query. Do you see the same difference in timing locally or is it only when 
deployed?

_Nik

On Jan 22, 2013, at 4:47 AM, Matt Andrews <m...@mattandrews.info> wrote:

> That looks really useful - for future reference, great! Sadly my webhost is 
> still bundling Django 1.2.3 :(
> 
> In general, though, these issues still come down to the fact that a SQL query 
> as executed by Django takes several times longer than going directly to the 
> DB. Is this down to my use of dictfetchall() or something more low level?
> 
> 
> On Tuesday, January 22, 2013 12:09:50 PM UTC, Jani Tiainen wrote:
> Hi, 
> 
> I see that you had quite a bunch of m2m keys. 
> 
> Have you tried recent version of Django (1.4+) with prefetch_related() [1] ? 
> 
> 
> [1] 
> <https://docs.djangoproject.com/en/1.4/ref/models/querysets/#prefetch-related>
>  
> 
> 
> 22.1.2013 13:57, Matt Andrews kirjoitti: 
> > Hi Jani, 
> > 
> > I made a StackOverflow post last year with an example of the ORM stuff I 
> > tried and the poor queries it produced: 
> > http://stackoverflow.com/questions/5843457/django-objects-all-making-360-queries-how-can-i-optimise-this-manytomany
> >  
> > 
> > There's also this discussion about how using the same queryset in two 
> > places in the template caused Django to request its data twice: 
> > http://stackoverflow.com/questions/9447053/best-way-to-slice-a-django-queryset-without-hitting-the-database-more-than-once
> >  (this 
> > was easily fixed, but again, not very intuitive and frustrated me) 
> > 
> > I don't have the data to hand currently but I also remember seeing weird 
> > things happen where queries would end with stuff like "... LIMIT 
> > 234423445" (or some crazy number which I'd never entered and was orders 
> > of magnitude bigger than the number of rows in the table). 
> > 
> > I'm aware these are probably edge cases that are down to my own novice 
> > status, but even using things like select_related(), it wasn't doing 
> > what I wanted. I just felt it easier to use my existing SQL (I'm 
> > converting a PHP app over to Django) and I'm not concerned about 
> > database portability (switching to postgres or whatever). 
> > 
> > Nik: just realised I missed your final question. For the SQL posted 
> > above, the numbers are approximately: 12,000 rows in the `news` table, 
> > maybe 10 `news_category` rows, about 100 `writers` and around 3000 
> > `images`. All properly indexed and with sensible column types. 
> > 
> > On Tuesday, January 22, 2013 10:53:40 AM UTC, Jani Tiainen wrote: 
> > 
> >     Hi, 
> > 
> >       From your raw SQL I saw you're doing few joins. So I suppose you do 
> >     quite a few foreign key fetches. 
> > 
> >     You didn't mention anything how you originally tried to solve case with 
> >     ORM. Could you please publish what you had when things were slow? 
> > 
> >     22.1.2013 12:26, Matt Andrews kirjoitti: 
> >      > Hi Nik, 
> >      > 
> >      > Thanks - I do feel like by circumventing the ORM I've just "given 
> >     up" 
> >      > and perhaps I'll reconsider -- none of my queries are particularly 
> >      > "specialist" (as the sample above indicates) - I just found Django 
> >      > generating odd things. 
> >      > 
> >      > To answer your questions: 
> >      > 
> >      > 1. Yes, reloading the page sees the same time for the queries (it 
> >     just 
> >      > feels as though the entire process takes a second or two to 
> >     start, which 
> >      > is perhaps not related to SQL itself). 
> >      > 
> >      > 2. I believe so, yes (it's shared hosting...). 
> >      > 
> >      > If you're curious, you can see a sample of the app at 
> >      > http://beta.scenepointblank.com <http://beta.scenepointblank.com> 
> >     (obviously you won't see the SQL, but 
> >      > the "delay" between pages, even though these pages are all cached 
> >     for 
> >      > 2hrs+, is partly my concern here). 
> >      > 
> >      > On Tuesday, January 22, 2013 4:24:09 AM UTC, Nikolas 
> >     Stevenson-Molnar wrote: 
> >      > 
> >      >     Hi Matt, 
> >      > 
> >      >     Firstly, I encourage you to have another crack a the ORM. It can 
> >      >     certainly seem a bit aggravating at times if you're coming 
> >     from a 
> >      >     SQL mindset, but really pays off down the road in terms of 
> >      >     maintainability and readability. Typically you should only 
> >     need raw 
> >      >     queries in Django in cases where you have super-specialized 
> >     (that 
> >      >     uses views or non-standard functions) queries or need some 
> >     specific 
> >      >     optimization. If there's really no way to perform many of your 
> >      >     "day-to-day" queries with the ORM then that's an indication 
> >     that a 
> >      >     different database design may fit your data model better. I 
> >      >     understand that you may have a unique situation, but I just 
> >     wanted 
> >      >     to throw that out there as I personally find the ORM to be a 
> >     huge 
> >      >     time saver. 
> >      > 
> >      >     Now, with that out of the way... a couple of considerations: 
> >     1) you 
> >      >     say it's a slow "startup"; if you refresh the page do the 
> >     queries 
> >      >     run just as slow the second time around? and 2) are your 
> >     Django app 
> >      >     and phpMyAdmin running on the same machine? If not, could 
> >     transit 
> >      >     time be an issue? 
> >      > 
> >      >     Finally, can you give an idea about the size of the tables in 
> >      >     question? How many rows in each? 
> >      > 
> >      >     _Nik 
> >      > 
> >      >     On 1/21/2013 3:25 PM, Matt Andrews wrote: 
> >      >>     Hi all, 
> >      >> 
> >      >>     Fairly new to Django. I ended up pulling out all of the 
> >      >>     ORM-generated queries and writing my own SQL directly (I got 
> >     fed 
> >      >>     up trying to work out how to achieve the kind of things I 
> >     needed 
> >      >>     without Django adding in extra joins or unintended WHERE 
> >     clauses 
> >      >>     etc). All my app's SQL uses cursor.execute() and the 
> >      >>     dictfetchall() method as referenced here 
> >      >> 
> >     
> > <https://docs.djangoproject.com/en/dev/topics/db/sql/#django.db.models.Manager.raw
> >  
> >     
> > <https://docs.djangoproject.com/en/dev/topics/db/sql/#django.db.models.Manager.raw>>.
> >  
> > 
> >      >> 
> >      >> 
> >      >>     I've found that my app incurs a couple of seconds load time in 
> >      >>     production, with CPU time at 2532ms and overall time 4684ms 
> >      >>     (according to the debug toolbar). I'm seeing 8 SQL queries take 
> >      >>     380ms, and each one seems to be several times slower when 
> >     made by 
> >      >>     Django versus hitting the database through phpMyAdmin or 
> >      >>     something: eg, this query: 
> >      >> 
> >      >>         SELECT * FROM news 
> >      >>         JOIN news_categories ON news.news_category_id = 
> >      >> news_categories.id <http://news_categories.id> 
> >     <http://news_categories.id> 
> >      >>         LEFT JOIN writers ON news.writer_id = writers.id 
> >     <http://writers.id> 
> >      >>         <http://writers.id> 
> >      >>         LEFT JOIN images ON news.image_id = images.id 
> >     <http://images.id> <http://images.id> 
> >      >>         ORDER BY news.is_sticky DESC, news.date_posted DESC 
> >      >>         LIMIT 10 
> >      >> 
> >      >> 
> >      >>     This takes 14.8ms when run in phpMyAdmin (against the 
> >     production 
> >      >>     database) but Django reports it as 85.2ms. The same ratios are 
> >      >>     true for all my other queries. 
> >      >> 
> >      >>     All I can think of is the note on the dictfetchall() method 
> >     in the 
> >      >>     Django docs which describes a "small performance hit". Is 
> >     this it?! 
> >      >> 
> >      >>     I've profiled the app too, although I'm a bit hazy about 
> >     what it 
> >      >>     all means. Here's a dump of the result: 
> >      >> http://pastebin.com/raw.php?i=UHE9edVC 
> >     <http://pastebin.com/raw.php?i=UHE9edVC> 
> >      >>     <http://pastebin.com/raw.php?i=UHE9edVC 
> >     <http://pastebin.com/raw.php?i=UHE9edVC>> (this is from running on 
> >      >>     my local server rather than production but performance is 
> >     broadly 
> >      >>     similar). 
> >      >> 
> >      >>     Can anyone help me? I realise I've perhaps gone off-piste by 
> >      >>     writing raw SQL but I feel it was justified. 
> >      >> 
> >      >>     thanks, 
> >      >>     Matt 
> >      >> 
> > 
> >     -- 
> >     Jani Tiainen 
> > 
> >     - Well planned is half done and a half done has been sufficient 
> >     before... 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "Django users" group. 
> > To view this discussion on the web visit 
> > https://groups.google.com/d/msg/django-users/-/H1vytr_AuFIJ. 
> > To post to this group, send email to django...@googlegroups.com. 
> > To unsubscribe from this group, send email to 
> > django-users...@googlegroups.com. 
> > For more options, visit this group at 
> > http://groups.google.com/group/django-users?hl=en. 
> 
> 
> -- 
> Jani Tiainen 
> 
> - Well planned is half done and a half done has been sufficient before... 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Django users" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/django-users/-/CxYZKPFVBQgJ.
> To post to this group, send email to django-users@googlegroups.com.
> To unsubscribe from this group, send email to 
> django-users+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/django-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to