DBAtlas · Атлас эксплуатации баз данных

Данные временных рядов

Oracle

-- Range partitioning by date:
CREATE TABLE measurements (
  ts TIMESTAMP, sensor_id NUMBER, value NUMBER)
PARTITION BY RANGE (ts)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
( PARTITION p0 VALUES LESS THAN (TIMESTAMP '2026-01-01 00:00:00') );

В Oracle данные временных рядов обычно управляются секционированием RANGE (INTERVAL); новые секции создаются автоматически, а старые легко удаляются (отсечение секций ускоряет запросы). Также используются сжатие (ILM/ADO) и материализованные представления для агрегации.

PostgreSQL

-- Hypertable with the TimescaleDB extension:
CREATE EXTENSION IF NOT EXISTS timescaledb;
CREATE TABLE measurements (ts TIMESTAMPTZ, sensor_id INT, value DOUBLE PRECISION);
SELECT create_hypertable('measurements', 'ts');
-- Summarize with a continuous aggregate.

PostgreSQL может хранить временные ряды с нативным секционированием (PARTITION BY RANGE); расширение TimescaleDB добавляет hypertables с автоматическим разбиением по времени на чанки, сжатием, политиками хранения и continuous aggregates. Распространённое решение для больших нагрузок IoT/метрик.

MySQL

-- RANGE partitioning by date:
CREATE TABLE measurements (
  ts DATETIME, sensor_id INT, value DOUBLE,
  PRIMARY KEY (ts, sensor_id))
PARTITION BY RANGE (TO_DAYS(ts)) (
  PARTITION p2026_01 VALUES LESS THAN (TO_DAYS('2026-02-01')),
  PARTITION pmax VALUES LESS THAN MAXVALUE);

MySQL не предлагает специального движка временных рядов; секционирование RANGE (с TO_DAYS/UNIX_TIMESTAMP) позволяет быстро удалять старые данные и отсекать секции. Для временных рядов большого объёма обычно предпочитают внешние решения (TimescaleDB, InfluxDB) или сводные таблицы.

SQL Server

-- Partitioned table (partition function + scheme) or
-- system-versioned temporal table (history kept automatically):
CREATE TABLE dbo.measurements (
  id INT PRIMARY KEY, value DECIMAL(10,2),
  valid_from DATETIME2 GENERATED ALWAYS AS ROW START,
  valid_to DATETIME2 GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to))
WITH (SYSTEM_VERSIONING = ON);

SQL Server управляет временными рядами через секционирование с partition function/scheme; это обеспечивает отсечение и быстрое архивирование данных за большие диапазоны дат. Кроме того, системно-версионные темпоральные таблицы (SYSTEM_VERSIONING) автоматически хранят историю изменений строк и позволяют запросы на момент времени (FOR SYSTEM_TIME).

MongoDB

// Time-series collection (MongoDB 5.0+):
db.createCollection("measurements", {
  timeseries: {
    timeField: "ts",
    metaField: "sensor_id",
    granularity: "seconds"
  }
})

Time-series-коллекции, появившиеся в MongoDB 5.0, автоматически хранят данные в сжатом колоночно-подобном (bucketed) формате по времени и мета-полю; сокращают использование диска и индексов и ускоряют запросы по диапазонам. timeField обязателен; metaField (источник/тег) и granularity определяют производительность.

Redis

# Requires the RedisTimeSeries module (Redis Stack).
# Create a series with a retention period:
TS.CREATE sensor:1 RETENTION 86400000 LABELS type temperature
# Add a sample (with an automatic timestamp):
TS.ADD sensor:1 * 23.5

В базовом Redis нет типа временных рядов; модуль RedisTimeSeries (Redis Stack) обеспечивает высокоскоростной приём отсчётов через TS.CREATE/TS.ADD, автоматическое хранение (RETENTION), даунсэмплинг (TS.CREATERULE) и запросы по диапазонам на основе меток через TS.RANGE/TS.MRANGE. Без модуля временные ряды эмулируются через Sorted Set.

Elasticsearch

# Data stream: automatically rolling indexes for time series
PUT _index_template/measurements-tpl
{ "index_patterns": ["measurements*"], "data_stream": {},
  "template": {
    "settings": { "index.mode": "time_series", "index.routing_path": ["sensor_id"] },
    "mappings": { "properties": {
      "@timestamp": { "type": "date" },
      "sensor_id": { "type": "keyword", "time_series_dimension": true },
      "temperature": { "type": "double", "time_series_metric": "gauge" } } } } }
PUT _data_stream/measurements

Elasticsearch управляет данными временных рядов через data streams; новые backing-индексы создаются автоматически со временем (rollover), а ILM перемещает старые данные по уровням hot/warm/cold и удаляет их. TSDS (index.mode: time_series) даёт оптимизации хранения, специфичные для метрик; обязательны хотя бы одно поле time_series_dimension, указывающий на него index.routing_path и поле @timestamp (иначе шаблон отклоняется).

Открыть в DBAtlas →