When running locally, are you also using a local database instance? IIRC the time that phpMyAdmin reports is the time taken for the database to execute the query, whereas the time reported by the debug toolbar (I /think/) is complete round-trip (send query, execute, return results). So if there is latency between your application and your database, that could account for the discrepancy.
The debug toolbar /does/ add overhead to your request (about doubles the page load time), but the numbers it reports should be more or less accurate (iow a page might take 1s to load with the toolbar, but the toolbar will report 500ms, which is accurate for load-time /without/ the toolbar). _Nik On 1/22/2013 9:26 AM, Matt Andrews wrote: > Hi Nik, > > I see the discrepancy both locally and when deployed, too -- that's > what's so puzzling. If it helps, I'm using MySQL and running it on > Windows locally and under Passenger on my remote Linux server (also on > MySQL). > > Only other thing I can think of is that this "overhead" might > literally be the extra work Django Debug Toolbar does to show queries > etc. Obviously when I turn the toolbar off then I can't see (directly) > the SQL times Django is getting, but could be a factor? Either way, > with the toolbar off on production, there's definitely a slight "lag" > before page requests start to kick in -- maybe this is unrelated to > the SQL, though. > > > On Tuesday, 22 January 2013 16:42:19 UTC, Nikolas Stevenson-Molnar wrote: > > 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 <ma...@mattandrews.info > <javascript:>> 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 >> >> <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 >> >> <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 >> >> <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/> >> <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> >> >> > >> >> <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 <http://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 <http://writers.id/>> >> > >> <http://writers.id <http://writers.id/>> >> > >> LEFT JOIN images ON news.image_id = >> images.id <http://images.id/> >> > <http://images.id <http://images.id/>> >> <http://images.id <http://images.id/>> >> > >> ORDER BY news.is <http://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>> >> > >> <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 >> <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 >> <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 >> <https://groups.google.com/d/msg/django-users/-/CxYZKPFVBQgJ>. >> To post to this group, send email to django...@googlegroups.com >> <javascript:>. >> To unsubscribe from this group, send email to >> django-users...@googlegroups.com <javascript:>. >> For more options, visit this group at >> http://groups.google.com/group/django-users?hl=en >> <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 view this discussion on the web visit > https://groups.google.com/d/msg/django-users/-/NvJBbauReMUJ. > 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.