No es solo "un montón de ajustes (índices, etc.)". Esto es crucial y obligatorio.
Publicaste algunos detalles, pero intentémoslo.
La regla es:trate de encontrar el conjunto de trabajo más común. A ver si cabe en la RAM. Optimice el hardware, la configuración del búfer de PG/OS y los índices/agrupación de PG para ello. De lo contrario, busque agregados, o si no es aceptable y necesita un acceso totalmente aleatorio, piense qué hardware podría escanear toda la tabla en un tiempo razonable.
¿Qué tamaño tiene su tabla (en gigabytes)? ¿Cómo se compara con la memoria RAM total? ¿Cuáles son sus configuraciones de PG, incluidos shared_buffers y efectiva_cache_size? ¿Es este un servidor dedicado? Si tienes una mesa de 250 gigas y unos 10 GB de RAM, significa que solo te cabe el 4 % de la mesa.
¿Hay alguna columna que se use comúnmente para filtrar, como estado o fecha? ¿Puede identificar el conjunto de trabajo que se usa más comúnmente (como solo el mes pasado)? Si es así, considere dividir o agrupar en clústeres estas columnas y definitivamente indexarlas. Básicamente, está tratando de asegurarse de que la mayor parte posible del conjunto de trabajo quepa en la RAM.
Evita a toda costa escanear la tabla si no cabe en RAM. Si realmente necesita un acceso absolutamente aleatorio, la única forma en que podría usarse es un hardware realmente sofisticado. Necesitaría una configuración persistente de almacenamiento/RAM que pueda leer 250 GB en un tiempo razonable.