Индекс не используется в реплике чтения Postgresql. Зачем?

У меня есть относительно большая таблица в производственной базе данных Amazon RDS (в диапазоне 2M записей). Я хочу сгруппировать по нескольким полям, включая месяц даты (server_time) в таблице. Чтобы немного ускорить процесс, я создал индекс в базе данных master следующим образом:

create index on build_requests(group_id, artifact_id, account_id, number_of_interfaces, date_trunc('month', server_build_time));

Затем, как и следовало ожидать, запрос для группировки данных использует индекс на главном:

GroupAggregate  (cost=0.55..311308.09 rows=1633231 width=85)
  Group Key: group_id, artifact_id, account_id, number_of_interfaces, date_trunc('month'::text, server_build_time)
  ->  Index Scan using build_requests_group_id_artifact_id_account_id_number_of_in_idx on build_requests  (cost=0.55..262417.68 rows=1898335 width=85)

Однако после ожидания более часа реплика чтения все еще не использует индекс:

GroupAggregate  (cost=434678.88..488313.41 rows=1633179 width=85)
  Group Key: group_id, artifact_id, account_id, number_of_interfaces, (date_trunc('month'::text, server_build_time))
  ->  Sort  (cost=434678.88..439424.56 rows=1898274 width=85)
        Sort Key: group_id, artifact_id, account_id, number_of_interfaces, (date_trunc('month'::text, server_build_time))
        ->  Seq Scan on build_requests  (cost=0.00..55053.43 rows=1898274 width=85)

Заходя в реплику чтения с помощью pgadmin, я вижу, что индекс присутствует, однако. Это проблема, так как медленная скорость запроса на реплике чтения (5 минут против 3 секунд) заставляет другие запросы, которые включают этот запрос через postgres_fdw (перекрестный запрос к базе данных), возвращать сбросы соединения ssl (вероятно, тайм-ауты?).

Любая идея, почему реплика чтения не захватывает / не использует индекс, который я определяю на ведущем устройстве, и как я могу исправить это? Запрос, который я выполняю как на главной реплике, так и на реплике чтения, идентичен:

SELECT group_id, artifact_id, 
       account_id, number_of_interfaces, 
       date_trunc('month', server_build_time) as server_build_month, 
       count(*)
FROM build_requests
GROUP BY group_id, artifact_id, 
         account_id, number_of_interfaces, 
         date_trunc('month', server_build_time);

Спасибо за вашу помощь!

1 ответ

Решение

Проблема заключалась в типах экземпляров amazon RDS. Исходный RDS был средой t2, тогда как реплика чтения была только микроинстанцией. После масштабирования реплики чтения на носитель реплика также использовала индекс.

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

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