Как оптимизировать запрос на количество значений в столбцах таблицы на сотни млн. строк?
Как я могу оптимизировать запрос для того, чтобы получить количество значений в столбцах таблицы?
Мой запрос сейчас выглядит вот так:
SELECT count('col1'), [...] count('col25')
FROM scheme.table
Правилен ли он, можно ли его как-нибудь оптимизировать или переписать как-то совсем иначе?
Проблема в том, что предположительно в таблице, с которой я работаю 158 млн. строк и я боюсь, что выполняться это будет просто до моей смерти.
Ответы (2 шт):
Возможно вам подойдет приблизительная статистика, которую можно найти в таблице pg_stats:
select *
from pg_stats
where schemaname='<your_schema_name>'
and tablename='<your_table_name>'
Можно попробовать создать индексы для не-строковых столбцов и сравнить план выполнения запроса с индексами и без них. Но делать это нужно аккуратно - иногда создание индекса может навредить. Особенно это актуально для таблиц, в которые часто пишут, т.к. при записи PostgreSQL придется обновлять индексы.
PS можно еще конечно помечтать о columnstore, но судя по комментариям, у вас нет прав админа.
нужно вытащить количество значений столбцов, количество уникальных значений, количество пропусков в столбцах и прочее-прочее
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 необходимо наличие индекса по этому полю. Но куча индексов по отдельным полям непременно скажется отрицательным образом на запросах модификации данных.