Индекс PostgreSQL на несколько столбцов, когда это слишком много?

Использование PostgreSQL 9.6

У меня есть таблица с некоторыми значениями, которые я хочу отфильтровать и упорядочить по времени:

  • отметка времени (может быть выбран в пользовательском интерфейсе)
  • строка состояния (пока только несколько известных значений, также можно выбрать в пользовательском интерфейсе)
  • контекст (объем данных в пользовательском интерфейсе)

Интересно, должен ли я иметь:

  1. Индекс btree включен (контекст, статус) + отдельный индекс по времени
  2. ИЛИ Индекс btree включен (контекст, статус, время)
  3. ИЛИ индекс btree на каждом?
  4. ИЛИ Индекс 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),

И есть другие возможности, соответствующие вашему описанию.

Другие вопросы по тегам