Estranho esse comportamento no postgresql, chegou a rodar alguma query para ver o tamanho físico de dados ocupados por tabelas e por índices?
Eu falo isso pois algumas vezes criamos diversos índices sem uma análise correta, e ao fazer uma consulta o banco acaba nem usando o índice.
Por exemplo: se eu criar um índice em cima da data de criação e um índices em cima de categoria, e fizer uma consulta onde eu busco um range de data de criação e filtro por uma categoria específica, o postgresql usaria apenas um índice nessa busca.
Dados agregados é pior ainda, existem soluções O(log n) envolvendo segtree em banco de dados que podem reduzir mais ainda o tempo de consulta.
Eu digo isso pois o postgresql é uma ferramenta muito customizavel (já vi gente fazendo cache usando postgresql mais performatico que o redis kkk) só que é necessário muito conhecimento e prática para conseguir ajustar ele pro teu caso. O modo default do postgresql que se usa tudo padrao SQL é no modo "pau pra toda obra", mas para casos mais específicos é necessário estudos mais aprofundados.