@lil_koi
лучший из худших

Как оптимизировать запрос?

У меня стоит задача. Есть табличка, у которой 205+-млн записей. Мне нужно обновить два столбца в ней. На данный монет они оба null.
нужно знать, что есть столбец date типа timestamp.
ЗАДАЧА

Нужно получить все записи за определённый час. Запрос выполняется примерно минуту. В одном дне 24ч, => 24 минуты за весь день. За месяц 24*30=720мин. Это очень долго, что бы обновить за 1 месяц, а у меня период 1.5 года. Всё уперается в то, что запрос на получение выборки за час выполняется очень долго. Как это можно оптимизировать? Я не нашёл, как проиндексировать дату в postgress. Прилагаю код, который написал.

import psycopg2
import requests
import datetime
import json

conn = psycopg2.connect(dbname='diplom', user='root', password='root', host='localhost')
cursor = conn.cursor()


with open('31.json', 'r') as handle:
    data = json.load(handle)
    first_object = data[0]['data']
    for i in range(len(first_object)):
      date = first_object[i]
      if(date['time'] >= 1628974800 and date['time'] <= 1630357199):
        time_start = datetime.datetime.fromtimestamp(date['time'])
        time_end = time_start + datetime.timedelta(hours=1, microseconds=-1)
        cursor.execute('''UPDATE nmea SET temperature = %s, wind_speed = %s WHERE "AIS" = 1 AND nmea.temperature IS NULL AND nmea.wind_speed IS NULL AND nmea.date >= %s AND nmea.date <= %s''', (date['temperature'], date['wind_speed'], time_start, time_end,))
        conn.commit()
        print(time_start)
    conn.commit()

Если кто-то сталкивался с обновлением таких масштабов - был бы рад услышать решение.
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Если нужно часто выполнять какие-то bulk-операции с данными за определённый период - лучше партиционировать таблицу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы