Я думаю, что вы задаете себе неправильный вопрос. Как уже ответил Лукаш, PostgreSQL может оказаться неэффективным для проверки всех столбцов в индексе. Проблема в том, что у вас слишком большой индекс на диске.
Вероятно, пытаясь ускорить этот SQL, вы добавили в индекс как можно больше столбцов, но это не дает результата.
Хитрость заключается в том, чтобы понять, сколько данных PostgreSQL должен прочитать, чтобы найти ваши записи. Если ваш индекс содержит слишком много данных, ему придется много читать. Также следует помнить, что столбцы с низким количеством элементов кардинально не работают с BTree и типами общих индексов; как правило, вы хотите избежать их индексации.
Чтобы иметь как можно меньший индекс и быстро выполнять поиск, вы должны найти столбец с большим количеством элементов или, что лучше, столбец, который будет возвращать меньше строк для вашего запроса. Я думаю, это "ctcSortOrder". Это будет первый столбец вашего индекса.
Теперь посмотрите, после фильтрации по 1-му столбцу, какой столбец имеет наибольшее количество элементов или отфильтрует большинство строк. Я понятия не имею о ваших данных, но «источник» выглядит хорошим кандидатом.
Старайтесь избегать поисков jsonb, если они не являются основным источником мощности, и сохраняйте индекс как Btree. BTree в несколько раз быстрее.
И, как предложил Лукаш, посмотрите на частичные индексы. Например, добавьте «WHERE Status IN (« ACTIVE »,« BACK ON MARKET ») И« isonlastsync = «true» », так как эти два параметра могут быть общими для всех ваших запросов.
Суть в том, что более простой, меньший индекс быстрее, чем индексируемые все столбцы. И порядок столбцов имеет большое значение. Придерживайтесь BTree, если на то нет веской причины (много кардинальных типов, не совместимых с btree).
Если ваша таблица огромная (> 10 миллионов строк), рассмотрите возможность разбиения таблицы, например ctcSortOrder. Но я не думаю, что это ваш случай.