Можно попробовать
материализовать какие-то срезы главной таблицы для
быстрого извлечения информации. Классифицировать
оперативные типы запросов и для каждого класса создать материализованную view читать оттуда.
Структура mat-view может быть денормализованной например
CREATE TABLE mview1 (id varchar primary key, doc JSON);
Формат документа может быть произвольным но главное что он должен
собирать ровно те сведенья которые нужны для responce ни больше ни меньше.
По поводу быстрого извлечения 100 тысяч datarows из 2 млн. Это вызывает у меня
большое изумление. Для кого эта выборка?
Человек-оператор не успеет прочитать
эти строки за разумное время. А для фоновых задач типа jobs скорость отлика вообще
не важна. Особенно если джобы работают ночью например и еще и объединяются в пакет.
И если у вас идет неравномерный доступ к таблице то возможно имеет смысл разделить
ее на union из двух таблиц типа
hot_data + historical_data. Это потребует переписывания
софта но зато у вас будет очень рациональное использование индексов. Они будут маленькие
и соотв. не будел вытеснения индексных страниц из кеша страниц.
Вот. Разделить можно по дате создания бизнес-факта или по другим вризнакам где есть date+time.