Я пытаюсь создать следующий индекс

CREATE INDEX request_response_partition_idx
  ON public.request_response_partition USING btree (userid,extract('Month' from time_stamp));

Я получаю ошибку;

ERROR:  functions in index expression must be marked IMMUTABLE

********** Error **********
ERROR: functions in index expression must be marked IMMUTABLE
SQL state: 42P17

person Yetendra Shakya    schedule 20.01.2020    source источник
comment
это то, что вы хотите?   -  person Barbaros Özhan    schedule 20.01.2020
comment
К какому типу данных относится столбец time_stamp?   -  person a_horse_with_no_name    schedule 20.01.2020


Ответы (1)


time_stamp должен быть timestamp with time zone.

Вам нужно будет составить выражение IMMUTABLE, преобразовав его в timestamp without time zone в соответствующем часовом поясе:

CREATE INDEX request_response_partition_idx
ON public.request_response_partition (
   userid,
   extract('Month' FROM (time_stamp AT TIME ZONE 'UTC'))
);

Конечно, вам также необходимо изменить выражение в ваших запросах, чтобы оно соответствовало индексу.

person Laurenz Albe    schedule 20.01.2020
comment
Спасибо. Это решило мою проблему. Но этот индекс не сканируется при explain запросе. Explain select data from public.request_response_partition08 where userid = 12025818 and time_stamp :: date between to_date('2019-08-10','YYYY-MM-DD') - interval '2 day' and to_date('2019-08-10','YYYY-MM-DD') + interval '2 day' не выполняет сканирование индекса. - person Yetendra Shakya; 21.01.2020
comment
Как я сказал в своем ответе, вам также необходимо изменить выражение в ваших запросах, чтобы оно соответствовало индексу. Таким образом, условие для time_stamp должно быть extract('Month' FROM (time_stamp AT TIME ZONE 'UTC')) BETWEEN .... Индексированное условие должно совпадать с выражением th в запросе. - person Laurenz Albe; 21.01.2020