#postgresql #database-design #database-partitioning #range-partitions
#postgresql #database-design #разделение базы данных #диапазон-разделы
Вопрос:
У меня есть одно приложение для хранения и запроса данных временных рядов от нескольких датчиков. Необходимо сохранить показания датчиков за несколько месяцев. И нам также нужно добавлять все больше и больше датчиков в будущем. Поэтому мне нужно учитывать масштабируемость в двух измерениях: время и идентификатор датчика. Мы используем postgresql db для хранения данных. Кроме того, чтобы упростить проектирование уровня запроса данных, мы хотим использовать одно имя таблицы для запроса всех данных.
Чтобы повысить эффективность запросов и масштабируемость, я рассматриваю возможность использования разделов для этого варианта использования. И я хочу создать разделы на основе двух столбцов. ДИАПАЗОН времени события для показаний. И ЗНАЧЕНИЕ для идентификатора датчика. Итак, в разделенной таблице я хочу получить некоторую вспомогательную таблицу как sensor_readings_1week_Oct_2020_ID1, sensor_readings_2week_Oct_2020_ID1, sensor_readings_1week_Oct_2020_ID2. Я знал, что PostgreSQL поддерживает разделение на несколько столбцов, но из большинства примеров я вижу, что RANGE используется только для всех столбцов. Один из примеров приведен ниже. Как я могу создать несколько разделов столбцов, один для временного диапазона, другой на основе конкретного идентификатора датчика? Спасибо!
CREATE TABLE p1 PARTITION OF tbl_range
FOR VALUES FROM (1, 110, 50) TO (20, 200, 200);
Или есть какие-то лучшие решения, помимо параметров, для этого варианта использования?
Комментарии:
1. Спасибо, приятель, двухуровневая схема разделения — это та, которую я ищу. Только что провел некоторый тест. Это значительно повышает эффективность.
Ответ №1:
Двухуровневые разделы — хорошее решение для моего варианта использования. Это значительно повышает эффективность.
CREATE TABLE sensor_readings (
id bigserial NOT NULL,
create_date_time timestamp NULL DEFAULT now(),
value int8 NULL
) PARTITION BY LIST (id);
CREATE TABLE sensor_readings_id1
PARTITION OF sensor_readings
FOR VALUES IN (111) PARTITION BY RANGE(create_date_time);
CREATE TABLE sensor_readings_id1_wk1
PARTITION OF sensor_readings_id1
FOR VALUES FROM (''2020-10-01 00:00:00'') TO (''2020-10-20 00:00:00'');