Your model was not-so-good Python/Django code style so it was bit hard 
to read but...

Low Kian Seong kirjoitti:
> On Tue, Nov 3, 2009 at 3:07 PM, Jani Tiainen <rede...@gmail.com> wrote:
>> Low Kian Seong kirjoitti:
>>> On Tue, Nov 3, 2009 at 1:33 PM, Jani Tiainen <rede...@gmail.com> wrote:
>>>> Low Kian Seong kirjoitti:
>>>>> I have about 3k plus record in my db table and am trying to do a
>>>>> simple render_to_response of a template sending it the results of a
>>>>> query. I debugged this and found that the total time taken for an
>>>>> operation like this is 50 seconds! Is there anyway to speed this up?
>>>>>
>>>> Answer is maybe.
>>> Model:
>>>
>> [clipped model code]
>>
>>> I isolated the code and ran the render_to_response by itself and
>>> measured the time.
>>>
>>>> First you have to provide model, view and template code you're using to
>>>> render your code, second the way you measured this 50 seconds.
>> How about view and template..? It seems that you have few foreign keys
>> at least that may cause extra roundtrips to db.



> 
> Template:
> 
> <html>
>       <head>
>       </head>
> {% if query %}
> {% load utils %}
> <table border=1>
> <thead>
>       <tr>
> 
>               <th bgcolor="#FFFF33" scope="col">Requestor</th>
>               <th bgcolor="#FFFF33" scope="col">Country (User)</th>
>               <th bgcolor="#FFFF33" scope="col">AD Domain</th>
>               <th bgcolor="#FFFF33" scope="col">Company Name</th>
>               <th bgcolor="#FFFF33" scope="col">Defender ID</th>
>               <th bgcolor="#FFFF33" scope="col">First Name</th>
>               <th bgcolor="#FFFF33" scope="col">Last Name</th>
>               <th bgcolor="#FFFF33" scope="col">Token S/N</th>
>               <th bgcolor="#FFFF33" scope="col">Token Pin</th>
>               <th bgcolor="#FFFF33" scope="col">IT Mgr</th>
>               <th bgcolor="#FFFF33" scope="col">HD Mgr</th>
>               <th bgcolor="#FFFF33" scope="col">SR Approver</th>
>               <th bgcolor="#FFFF33" scope="col">SR No. (Setup Cost)</th>
>               <th bgcolor="#FFFF33" scope="col">SR No. (On Going Cost)</th>
>               <th bgcolor="#FFFF33" scope="col">SR No. (Orange Cost)</th>
>               <th bgcolor="#FFFF33" scope="col">Creation Date</th>
>               <th bgcolor="#FFFF33" scope="col">Acct. Status</th>
>       </tr>
> </thead>
> {% for record in query %}
>       <tr>
>               <th>{{record.requestor}}</th>
>               <th>{{record.country}}</th>
>               <th>{{record.ad_domain_group}}</th>
>               <th>{{record.company}}</th>
>               <th align="left">{{record.defender_id}}</th>
>               <th align="left">{{record.first_name}}</th>
>               <th align="left">{{record.last_name}}</th>
>               <th>{{record.rsa_token_serial_number}}</th>
>               <th>{{record.token_initial_pin}}</th>

>               <th>{{record.it_manager_id.name}}</th>
>               <th>{{record.sr_manager_id.name}}</th>
>               <th>{{record.hd_manager_id.name}}</th>

All these three might hit another roundtrip to database. Since you're 
using them, you might want to use select_related() method.

>               <th>{{ record.ad_domain_group|defender_setup }}</th>
>               <th>{{ record.ad_domain_group|defender_on_going }}</th>
>               <th>{{ record.ad_domain_group|defender_orange }}</th>
>               <th>{{record.creation_date}}</th>
>               <th>{{ record.disable_date|show_status:end_date }}</th>
>       </tr>
> {% endfor %}
> </table>      
> {% endif %}
> </html>
> 
> 
> views.py:
> 
> def do_defender_advanced(request):
>       query = request.POST.get('query_text','')
>       entries = defender.objects.all()
>       query_text_string = request.POST['query_text']
>       start_date_string = request.POST.get('start_date','')
>       end_date_string = request.POST.get('end_date',str_today)
> 
>       if ('query_text' in request.POST) and 
> request.POST['query_text'].strip():
> 
>               query_text_string = request.POST['query_text']
>               start_date_string = request.POST.get('start_date','')
>               end_date_string = request.POST.get('end_date',str_today)
>               if len(start_date_string) == 0:
>                               start_date_string = str_today
>               if len(end_date_string) == 0:
>                               end_date_string = str_today
>               query_text_string = request.POST['query_text']
>               qset=(
>                       Q(first_name__icontains=query_text_string)|
>                       Q(last_name__icontains=query_text_string)|
>                       Q(country__icontains=query_text_string)|
>                       Q(existing_defender_id__icontains=query_text_string)
>                       )
>               
>               if query_text_string.lower() == "all":
>                               found_entries = defender.objects.all()
>               elif query_text_string.lower() != "all":
>                               found_entries = defender.objects.filter(qset)
>               found_entries = found_entries.filter(
> #                                                     status = 'active',
>                                                       
> creation_date__range=[start_date_string,
>                                                       
> end_date_string]).values()
>       else:
>               found_entries = ''
>       if len(found_entries) > 0:

Note that this will fetch all entries in queryset from DB to memory. If 
you want just to know is there anything use .count(), not len().

Both features (len, count and select_related) are documented in : 
<http://docs.djangoproject.com/en/dev/ref/models/querysets/>

>               response = render_to_response("defender_advanced_report.html",
>                               {"query":found_entries},
>                               Context( {'end_date':end_date_string } )
>                               )

You might want to check how much data you actually get (in terms of bytes).

-- 
Jani Tiainen

--~--~---------~--~----~------------~-------~--~----~
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