2013-06-25 2 views
1

이 뷰에 포함 된 모델입니다 :views.py에서 Django SQL SELECT 쿼리를 최적화하는 방법?

def list_movies(request, time_period): 
    city = utils.get_city_from_request(request) 

    if time_period == 'proximas-dos-horas': 
     (start_date, 
     end_date, 
     hours_start, 
     hours_end) = utils.get_datetime_filters_from_time_period(time_period) 
    else: 
     (start_date, 
     end_date) = utils.get_datetime_filters_from_time_period(time_period) 

    if not start_date: # 404 for invalid time periods 
     raise Http404 

    movies = Movie.objects.filter(
     showtime__city=city.code, 
     showtime__visible=1, 
     ).order_by('-tsm').distinct() 

    if time_period == 'proximas-dos-horas': 
     movies = movies.filter(
      showtime__start_date__lte=start_date, 
      showtime__end_date__gte=end_date, 
      showtime__time__range=(hours_start, hours_end)) 

    elif time_period == 'proximos-estrenos': 
     movies = movies.filter(
      showtime__start_date=None, 
      showtime__end_date=None, 
      ) 

    else: 
     movies = movies.filter(
      showtime__start_date__lte=start_date, 
      showtime__end_date__gte=end_date) 

    context = {'movies': movies, 'city': city, 'time_period': time_period} 
    return render_to_response('list_movies.html', context, 
           context_instance=RequestContext(request)) 

현재이 뷰가 데이터베이스에 많은 자원을 소모하고,이 결과 :

class Movie(models.Model): 
    title_original = models.CharField(max_length=300, 
             db_column='titulooriginal') 
    title_translated = models.CharField(max_length=300, blank=True, 
             db_column='titulotraducido') 
    thumbnail = models.CharField(max_length=300, blank=True, 
           db_column='imagen') 
    length = models.CharField(max_length=75, db_column='duracion') 
    rating = models.CharField(max_length=75, db_column='censura') 
    genre = models.CharField(max_length=75, db_column='genero') 
    country_of_origin = models.CharField(max_length=150, db_column='pais') 
    trailer = models.CharField(max_length=300, blank=True, db_column='trailer') 
    synopsis = models.CharField(max_length=3600, blank=True, 
           db_column='sinopsis') 
    cast = models.CharField(max_length=300, blank=True, db_column='elenco') 
    director = models.CharField(max_length=150, db_column='director') 
    slug = models.SlugField(unique=True, blank=True) 
    tsc = models.DateTimeField(auto_now=False, auto_now_add=True, db_column='tsc', null=True) 
    tsm = models.DateTimeField(auto_now=True, auto_now_add=True, db_column='tsm', null=True) 

    class Meta: 
     db_table = u'peliculas' 

    def __unicode__(self): 
     return self.title_original 


class ShowTime(models.Model): 
    LANGUAGE_ESPANOL = 'Espanol' 
    LANGUAGE_SUBTITLED = 'Subtitulada' 
    LANGUAGE_CHOICES = (
     (LANGUAGE_ESPANOL, LANGUAGE_ESPANOL), 
     (LANGUAGE_SUBTITLED, LANGUAGE_SUBTITLED)) 

    movie = models.ForeignKey(Movie, db_column='idpelicula') 
    theater = models.ForeignKey(Theater, db_column='idcine', 
             null=True) 
    time = models.TimeField(null=True, db_column='hora') 
    type_3d = models.NullBooleanField(db_column=u'3d') 
    type_xd = models.NullBooleanField(null=True, db_column='xd') 
    type_gtmax = models.NullBooleanField(null=True, db_column='gtmax') 
    type_vip = models.NullBooleanField(null=True, db_column='vip') 
    type_imax = models.NullBooleanField(null=True, db_column='imax') 
    language = models.CharField(max_length=33, blank=True, db_column='idioma', 
           choices=LANGUAGE_CHOICES, 
           default=LANGUAGE_ESPANOL) 
    city = models.ForeignKey(City, db_column='idciudad') 
    start_date = models.DateField(blank=True, db_column='fecha_inicio') 
    end_date = models.DateField(blank=True, db_column='fecha_fin') 
    visible = models.NullBooleanField(null=True, db_column='visible') 
    tsc = models.DateTimeField(auto_now=False, auto_now_add=True, db_column='tsc', null=True) 
    tsm = models.DateTimeField(auto_now=True, auto_now_add=True, db_column='tsm', null=True) 

    class Meta: 
     db_table = u'funciones' 

    def __unicode__(self): 
     return (unicode(self.theater) + " " + unicode(self.movie.title_original) + " " +   unicode(self.time)) 

은 또한이 모델을 쿼리 뷰입니다 브라우저에서 웹 트랜잭션의 응답 시간이 짧습니다. 나는 앱과 DB 레벨의 트랜잭션을 분석하기 위해 New Relic 모니터링 소프트웨어와 앱을 연결했습니다. 이것은 내가 가진 것을 추적 세부 사항입니다 :

enter image description here

DB 자원의 소비가 최소

고마워요을 삭제하도록 내가이보기를 최적화 SOMO 조언을 좀하고 싶습니다!

+0

'showtime__start_date = None'을'showtime__start_date__isnull = True'로 바꾸고 싶을 수도 있습니다. – karthikr

+0

showtime__start_date 또는 showtime__end_date에 대한 색인이 있습니까? 새로운 유물이 당신이 할 수 있도록하고 explain_plan 쿼리. 그렇다면 문제 진단에 도움이 될 것입니다. – DrewM

답변

0
나는 문제의 맥락을 모르는

,하지만 내 2 조언은 다음과 같습니다

먼저, 데이터 모델에 약간 수정을 고려하십시오. ShowTime 클래스는 외래 키가 City이고 외래 키가 Theater이며 약간 중복 된 것처럼 보입니다.

class Theater(models.Model): 
    name = models.CharField(max_length=48) 
    # Location fields. 
    geo_country = models.CharField(max_length=48) 
    geo_country_code = models.CharField(max_length=2) 
    geo_locality = models.CharField(max_length=48) 
    geo_street = models.CharField(max_length=48, blank=True, default="") 
    geo_address = models.CharField(max_length=120, blank=True, default="") 


class ShowTime(models.Model): 
    theater = models.ForeignKey(Theater) 

이 방법, 당신은이 City 테이블에 가입 저장할 수 있으며이 데이터 모델로부터 삭제 될 수 있습니다 개인적으로는 예를 들어, 해제 정상화 주소를 선호합니다.

둘째, Django ORM의 select_related feature을 읽으십시오.

재미있게 보내십시오.

관련 문제