Вы можете разобрать это вместе из системных каталогов, как подробно описал Эрвин Брандстеттер.
Вот запрос, который вернет необходимую информацию:
SELECT i.indexrelid::regclass AS indexname,
k.i AS index_order,
i.indnkeyatts,
coalesce(a.attname,
(('{' || pg_get_expr(
i.indexprs,
i.indrelid
)
|| '}')::text[]
)[k.i]
) AS index_column,
i.indoption[k.i - 1] = 0 AS ascending,
k.i <= i.indnkeyatts AS is_key
FROM pg_index i
CROSS JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS k(attnum, i)
LEFT JOIN pg_attribute AS a
ON i.indrelid = a.attrelid AND k.attnum = a.attnum
WHERE i.indrelid = 'schemaname.tablename'::regclass;
Этот запрос будет работать тольконачиная с PostgreSQL версии v11 (но до версии v11 нет покрывающих индексов).
Кроме того, запрос не будет выполнен, если индексированное выражение содержит запятую;Я не знаю, как это исправить.