Как создать индекс по записям за последние 90 дней в Postgres делает now () неизменным - PullRequest
1 голос
/ 10 октября 2019

У меня есть случай, когда из-за проблем со скоростью я хочу создать индекс только для записей за последние 90 дней.

Когда я пытаюсь создать индекс следующим образом:

create index if not exists idx_d1_section_learner_partial_date_modified
    on instruct.d1_section_learner (audit_modified_datetime)
    where (audit_modified_datetime >= '2019-07-01 00:00:00'::timestamp);

Это работает, но я хотел сохранить динамику, поэтому я попробовал это:

create index if not exists idx_d1_section_learner_partial_date_modified
    on instruct.d1_section_learner (audit_modified_datetime)
    where (audit_modified_datetime >= now() - interval '90 days'::timestamp);

Это даетошибка:

ОШИБКА: функции в предикате индекса должны быть помечены IMMUTABLE

Я знаю, что это происходит из-за текущей метки времени. Потому что это не константа в транзакции. Есть ли способ, которым я могу сделать это, избегая этого?

Или, может быть, можно пометить current_timestamp как неизменный?

1 Ответ

0 голосов
/ 11 октября 2019

Вместо неизменной функции now() (которая не будет работать!) Используйте псевдо-неизменяемую функцию, возвращающую константу timestamp, и основывайте на ней свой частичный индекс, а также ваши запросы, которые должны использоватьit.

Кроме того, не нужно обновлять индекс каждый день. Индекс может содержать пару устаревших строк, что вряд ли актуально. Вы просто добавляете точное условие к своим запросам дополнительно . Производительность ухудшается медленно с течением времени по мере добавления новых строк. Достаточно время от времени воссоздавать функцию и индексировать. Может быть каждую неделю время от времени с самой низкой загрузкой БД.

Просто так получилось, что я опубликовал полное решение для случая 6 лет назад :

Немного обновлено, чтобы отразить последние события.

В сторону: now() возвращает timestamptz, а не timestamp. LOCALTIMESTAMP будет лучше. Но не ходи туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...