Как оптимизировать запрос на количество значений в столбцах таблицы на сотни млн. строк?

Как я могу оптимизировать запрос для того, чтобы получить количество значений в столбцах таблицы?

Мой запрос сейчас выглядит вот так:

SELECT count('col1'), [...] count('col25')
FROM scheme.table

Правилен ли он, можно ли его как-нибудь оптимизировать или переписать как-то совсем иначе?

Проблема в том, что предположительно в таблице, с которой я работаю 158 млн. строк и я боюсь, что выполняться это будет просто до моей смерти.


Ответы (2 шт):

Автор решения: MaxU

Возможно вам подойдет приблизительная статистика, которую можно найти в таблице pg_stats:

select * 
from pg_stats
where schemaname='<your_schema_name>'
  and tablename='<your_table_name>'

Можно попробовать создать индексы для не-строковых столбцов и сравнить план выполнения запроса с индексами и без них. Но делать это нужно аккуратно - иногда создание индекса может навредить. Особенно это актуально для таблиц, в которые часто пишут, т.к. при записи PostgreSQL придется обновлять индексы.


PS можно еще конечно помечтать о columnstore, но судя по комментариям, у вас нет прав админа.

→ Ссылка
Автор решения: Akina

нужно вытащить количество значений столбцов, количество уникальных значений, количество пропусков в столбцах и прочее-прочее

SELECT 'col1' column_name, 
       count(col1) cnt, 
       count(distinct col1) cnt_distinct, 
       count(col1) - count(distinct col1) cnt_null
FROM scheme.table

UNION ALL
-- ...

SELECT 'colN' column_name, 
       count(colN) cnt, 
       count(distinct colN) cnt_distinct, 
       count(colN) - count(distinct colN) cnt_null
FROM scheme.table

Для оптимизации каждого отдельного подзапроса по colX необходимо наличие индекса по этому полю. Но куча индексов по отдельным полям непременно скажется отрицательным образом на запросах модификации данных.

→ Ссылка