Выбор индексов для временных рядов
Выбирайте подходящие индексы для рабочих нагрузок временных рядов — составной индекс (device_id, ts DESC) покрывает распространённый сценарий
«Выбор индексов для временных рядов» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Распространённый запрос к временному ряду
«Недавние данные для одной сущности»:
SELECT * FROM metrics
WHERE device_id = 42
AND ts >= NOW() - INTERVAL '24 hours'
ORDER BY ts DESC LIMIT 1000;Составной индекс (device_id, ts DESC)
Канонический индекс для временных рядов:
CREATE INDEX metrics_device_ts_idx
ON metrics (device_id, ts DESC);
-- Equality on device_id, range + sort on ts: index handles both.Почему порядок важен
- (device_id, ts) — оптимально для запроса «это устройство, недавние данные»
- (ts, device_id) — оптимально для запроса «этот момент времени, все устройства»
Выбирайте индекс с учётом сочетания запросов.
BRIN для таблиц только с добавлением данных
BRIN занимает совсем мало места — несколько MB для таблицы с миллиардом строк. Он эффективен только тогда, когда данные физически упорядочены по индексируемому столбцу, как обычно бывает у временных рядов:
CREATE INDEX metrics_ts_brin ON metrics USING BRIN (ts);
-- Excellent for "give me last 24 hours" on append-only tables.B-tree и BRIN
- B-tree — поиск по точному идентификатору за миллисекунды; поиск по недавнему времени
- BRIN — быстрое сканирование диапазонов в монотонных данных; дёшев в обслуживании
Их можно комбинировать: B-tree для (device_id), BRIN для (ts).
Индексы гипертаблиц
TimescaleDB распространяет индексы на все чанки. Удаляйте неиспользуемые индексы — они создают затраты для каждого чанка.
Частичные индексы для активно используемых подмножеств
Если 99% запросов обращаются к недавним данным:
CREATE INDEX metrics_recent_idx
ON metrics (device_id, ts DESC)
WHERE ts >= NOW() - INTERVAL '7 days';
-- Issue: predicate must use literal date or be re-created periodically.Не применяйте функции к индексируемому столбцу
Не применяйте функции к индексируемому столбцу — это лишает запрос возможности использовать индекс:
-- BAD:
WHERE date_trunc('hour', ts) = $1
-- GOOD:
WHERE ts >= $1 AND ts < $1 + INTERVAL '1 hour'Индекс для запросов последних строк
Для запроса «последнее показание каждого устройства» правильный индекс превращает запрос в сканирование диапазона индекса:
CREATE INDEX metrics_device_ts_idx ON metrics (device_id, ts DESC);
SELECT DISTINCT ON (device_id) device_id, ts, value
FROM metrics
ORDER BY device_id, ts DESC;
-- Uses the index to take the first row per device.Кластеризация по часто используемому порядку
CLUSTER физически переупорядочивает таблицу по индексу. Это одноразовая операция; новые данные по-прежнему добавляются в порядке поступления:
CLUSTER metrics USING metrics_device_ts_idx;
-- Cluster is heavy. TimescaleDB chunks help by keeping recent chunks small.Хеш-индекс для равенства с высокой кардинальностью
В временных рядах его используют редко, но он существует. Обычно достаточно B-tree для device_id.
Не создавайте слишком много индексов
Таблицы временных рядов интенсивно используются для записи. Каждый индекс усиливает нагрузку на запись. Добавляйте только индексы, по которым выполняются запросы.
Итоги
Индексация временных рядов сводится к небольшому набору шаблонов.
- Составной (entity, ts DESC) для запросов по сущности
- BRIN для ts при запросах диапазонов к таблицам только с добавлением данных
- Для гипертаблиц: индексы распространяются на чанки
- Избегайте предикатов с функциями над столбцами
Быстрая проверка
Ваш самый частый запрос к временному ряду фильтрует данные по device_id и читает последние 24 часа. Какой индекс лучше всего подходит?
Изучай SQL с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 46
- Уроки
- 183
Часто задаваемые вопросы
Урок «Выбор индексов для временных рядов» бесплатный?
Да — полный текст урока «Выбор индексов для временных рядов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выбор индексов для временных рядов»?
Выбирайте подходящие индексы для рабочих нагрузок временных рядов — составной индекс (device_id, ts DESC) покрывает распространённый сценарий Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Выбор индексов для временных рядов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Гипертаблицы TimescaleDB
- Непрерывные агрегаты
- Политики сжатия и хранения
- Выбор индексов для временных рядов