2013-06-10 10 views
0

Мой вопрос что-то в общем, как я ищу предложения на лучший способ работы с запросом на PostgreSQL с характеристиками:производительность Postgresql и Django

  • интервал от клиентской части 5 секунд
  • Более 5000 записей по каждому результату запроса
  • результат набор четыре присоединился таблицы
  • набор результат будет отображаться на карте Google

Скорее всего, представление может быть лучше, чем простой SQL или, возможно, процедура хранения. На данный момент я использую общий запрос AJAX, и мой AJAX код:

def request_positions(request): 
    try: 
     vehicles = Vehicle.objects.filter(registration__in = simplejson.loads(request.GET['vehicles'])) 
    except MultiValueDictKeyError: 
     vehicles = Vehicle.objects.all() 
    points = [] 

    for vehicle in vehicles: 
     point = { 
       'vehicle' : vehicle.registration, 
       'imei': None, 
       'latitude': None, 
       'longitude':None, 
       'course': None, 
       'speed': None, 
       'mileage': None, 
       'gps_signal': None, 
       'gsm_signal': None, 
       'alarm_status': None, 
       'gps_satus': None, 
       'vehicle_status': None, 
       'alarm_over_speed': None, 
       'other': None, 
       'date_time_process': None, 
      } 
     try: 
      vehicledevice = vehicle.vehicledevice_set.get(is_joined__exact = True) 
      try: 
       track = vehicledevice.device.devicetrack_set.exclude(date_time_process__isnull = True).latest('date_time_process') 
       point['imei'] = vehicledevice.device.imei 
       point['latitude'] = track.latitude 
       point['longitude'] =track.longitude 
       point['course'] = track.course 
       point['speed'] = track.speed 
       point['mileage'] = track.mileage 
       point['gps_signal'] = track.gps_signal 
       point['gsm_signal'] = track.gsm_signal 
       point['alarm_status'] = track.alarm_status 
       point['gps_status'] = track.gps_status 
       point['vehicle_status'] = track.vehicle_status 
       point['other'] = track.other 
       point['date_time_process'] = track.date_time_process.astimezone(tz.gettz()).strftime("%Y-%m-%d %H:%M:%S") 
       points.append(point) 
      except ObjectDoesNotExist: 
       pass 

     except ObjectDoesNotExist: 
      pass 
    json = simplejson.dumps(points) 
    return HttpResponse(json, mimetype='application/json') 

Моего приложение для отслеживания, который хранит данные каждые 10 секунд, и около 5000 трекер, используя витую демону. Затем мне нужен способ получить быстрые ответы без дополнительной загрузки на стороне клиента, как вы могли видеть, я использую общие определения django, но я также пытаюсь оптимизировать этот запрос, чтобы сократить время запроса и ответа Кроме того, заряд сети и сервера, я имею в виду, лучший способ получить лучший процесс.

+0

Отправьте запрос. – orokusaki

+0

Я редактировал свой пост с кодом, однако я пытался избежать вставки кода, пытаясь найти предложение, не зависящее от кода, я надеюсь, что это может помочь получить лучшую помощь – Carlos

ответ

3

Я вообще не делал этого в PostgreSQL (и я HUGE PG fan). Эти данные так часто меняются, что я бы сохранил его в чем-то вроде Redis по идентификатору автомобиля. Вы все равно можете хранить его в PG для долгосрочных целей отчетности, но для этого конкретного вида вам будет сложно сделать его очень страшно.

Если вы должны остаться, используя только PG, эти вещи помогут:

  • Ограничьте Vechile QuerySet используя только(), чтобы захватить только те поля, нужно здесь.
  • Вместо того, чтобы создавать большой словарь с большим количеством Nones, а затем сбрасывать их, измените свой код, чтобы вместо этого заполнить словарь «point» с помощью track.get ('', None). Также делает ваш код немного короче/яснее.
  • Убедитесь, что у вас есть индекс в поле «date_time_process».
  • Если вы на Python 2.7 не используют simplejson, то STDLIB JSON на самом деле немного быстрее и Джанго капли поддержку simplejson в Django 1.5
  • Использование select_related() и/или prefetch_related() для ваших отношений чтобы захватить их как часть запроса на поиск автомобиля.
  • Определенно рассмотрите использование View или сохраненной процедуры, чтобы сделать это намного быстрее.
+0

Конечно, и мне нужно хранить мои данные надолго и то, что вы говорите мне, это то, что я ищу, большое спасибо за ваш ответ. – Carlos

+0

То, что я не понял, - это track.get ('', None), не могли бы вы дать мне больше информации или url об этом, потому что я искал его с успехом – Carlos

+0

Маленький мир. Фрэнк Уайлз сделал несколько консультаций для компании, с которой я работаю ... человек гений. – orokusaki

Смежные вопросы