Вы говорите, что критерии «года» присутствуют лишь иногда, поэтому я, вероятно, не стал бы вести индекс по этому столбцу.
Но поскольку некоторые из ваших столбцов являются диапазонами или IN-списками, вы можете быть лучше использовать несколько индексов с одним столбцом (но все с одним и тем же условием WHERE), и пусть PostgreSQL объединит их с BitmapAnd.
Многоколоночный индекс GiST (с использованием расширения btree_gist) по столбцам с критериями диапазона может быть полезными, но обычно они меня разочаровывают. Особенно, сколько времени уходит на их сборку.
Что делать со строками, которые не соответствуют images_count > 0 AND sales_state::text = 'onsale'::text AND is_disabled IS NOT TRUE AND featuring_score IS NOT NULL
? Может быть, вы могли бы просто удалить их, или заархивировать, или отделить от остальных строк.
Одна эвристика c, которую вы могли бы использовать, - это запуск запроса с предложением WHERE, содержащим featuring_score < 'C' and au_rating >= 3
, с соответствующим индексом WHERE. Затем, если у вас меньше 10 строк, выбросьте результат и вместо этого запустите исходный запрос.
Если вы можете клонировать свою базу данных и обновить клон до 13BETA1, было бы интересно посмотреть, будет ли новая добавочная сортировка функция будет использоваться с вашим 2-м индексом, и если да, то насколько хорошо она работает.
При отсутствии LIMIT, сколько строк вы ожидаете, что это семейство запросов вернет при «типичном» использовании?
Просмотр вывода EXPLAIN (ANALYZE, BUFFERS)
для некоторых типичных запросов (как с LIMIT, так и без него) не повредит.