Индекс PostgreSQL на несколько столбцов, когда это слишком много?
Использование PostgreSQL 9.6
У меня есть таблица с некоторыми значениями, которые я хочу отфильтровать и упорядочить по времени:
- отметка времени (может быть выбран в пользовательском интерфейсе)
- строка состояния (пока только несколько известных значений, также можно выбрать в пользовательском интерфейсе)
- контекст (объем данных в пользовательском интерфейсе)
Интересно, должен ли я иметь:
- Индекс btree включен (контекст, статус) + отдельный индекс по времени
- ИЛИ Индекс btree включен (контекст, статус, время)
- ИЛИ индекс btree на каждом?
- ИЛИ Индекс btree включен (время, состояние, контекст) для небольших временных диапазонов?
Я подозреваю, что номер 1 - лучший вариант, контекст + статус позволит отфильтровывать значения, а затем будет сканировать индекс времени. Я создал номер 1 одновременно с моими данными и увидел некоторые улучшения, но как вы выбираете между каждым подходом, есть ли какие-то рекомендации?
Один из запросов выглядит примерно так:
select * from event
where severity = 'WARNING' and
fk_context = 1359544
order by timestamp LIMIT 30; // Other one has timestamp > ...
Другой ищет временной диапазон. Похоже, что postgres использует несколько индексов, один с (fk_context, severity, timestamp), а затем использует индекс (severity, time), но это также зависит от лимита.
1 ответ
Ваш вопрос неясен. Если у вас есть три возможных условия:
where timestamp between @a and @b order by time
where status = @s order by time
where context = @c order by time
Тогда вы хотите три индекса: (timestamp, time)
, (status, time)
, а также (context, time)
,
Если условия:
where timestamp between @a and @b and
status = @s and
context = @c
order by time
Тогда вы хотите один индекс, (status, context, timestamp, time)
,
И есть другие возможности, соответствующие вашему описанию.