Вдохновленный постом Томмазо Пиффери , я создал базу данных PostgreSQL (11) для работы с данными временных рядов: 316 тыс. Финансовых инструментов, всего 139 млн записей.Временные ряды разных инструментов различаются по длине и временным периодам и часто имеют разрывы.Есть две таблицы: описание приборов и данные записей временных рядов.Структура очень проста:
TABLE instruments
имеет
instr_id INT PRIMARY KEY
и - еще 9 столбцов, описывающих каждый инструмент,
TABLE timeseries
имеет
PRIMARY KEY (instr_id, date)
, где
instr_id INT REFERENCES instruments(instr_id)
связывает времязаписи серии с описанием прибора,
date DATE NOT NULL
- это дата записи временного ряда
Нет индекса для date
.
еще 5 столбцов, содержащих такие показатели, как цена, объем торгов и т. Д.
Я работаю в Python 3.7, использую psycopg2 в качестве драйвера и sqlalchemyкак ORM (но это, вероятно, не имеет значения).Сначала я заполнил базу данных с использованием DataFrame.to_sql, запустил VACUUM и проверил, что простые запросы работают правильно.Затем я хотел добавить в таблицу instruments
несколько столбцов, обобщающих свойства временных рядов.Вот первый запрос, который я выполнил, используя cursor.execute()
, чтобы проверить эту идею.Предполагается найти для каждого временного ряда дату самой ранней записи времени:
ALTER TABLE instruments
ADD begin DATE;
UPDATE instruments SET
begin = (
SELECT MIN(date) FROM timeseries
WHERE timeseries.instr_id=instruments.instr_id
);
Этот запрос выполнялся на настольном ПК (Intel i5, 8 ГБ памяти, Windows 7) около 20часов без результата.Активность сервера, отображаемая в pgAdmin 4, выглядит следующим образом.
Я новичок в реляционных базах данных и SQL.Это нормально, что такой запрос выполняется так долго, или я делаю что-то не так?