В повседневной работе с PostgreSQL иной раз возникает задача оценить или узнать точное число строк в таблице. Классический способ — SELECT COUNT(*) FROM table — работает, но для больших таблиц он может быть медленным, поскольку выполняет полное сканирование таблицы или индекса. К счастью, есть альтернативные методы, которые либо дают мгновенный результат (пусть и приблизительный), либо позволяют оценить селективность сложного запроса без его фактического выполнения.
Приблизительная оценка через системный каталог pg_class
Самый быстрый способ получить представление о размере таблицы — обратиться к статистике, которую PostgreSQL собирает для планировщика запросов. Эта статистика хранится в системном представлении pg_class, а именно в поле reltuples.
|
1 2 3 |
SELECT reltuples::BIGINT AS approximate_count FROM pg_class WHERE oid = 'your_table_name'::regclass; |
Как это работает
pg_class содержит информацию о каждой таблице, индексе и других объектах базы данных. Поле reltuples хранит оценку количества строк, которую планировщик использует для построения планов выполнения. Это значение обновляется командами VACUUM, ANALYZE и некоторыми DDL-операциями (например, CREATE INDEX).
Точность
Оценка в reltuples не является точной — она может отставать от реального количества строк, особенно если после последнего обновления статистики в таблицу было вставлено или удалено много записей. Чтобы получить более свежую оценку, перед запросом можно выполнить:
|
1 |
ANALYZE your_table_name; |
Однако даже после ANALYZE значение остаётся приблизительным, поскольку оно вычисляется на основе выборочного сканирования.
Когда использовать
Этот метод идеально подходит для:
- Мониторинга роста таблиц в системах наблюдения;
- Быстрой оценки размера таблицы перед выполнением тяжёлой операции;
- Ситуаций, где абсолютная точность не требуется (например, для приблизительного подсчёта записей в логах или временных таблицах).
Главное преимущество — скорость: запрос выполняется практически мгновенно даже для таблиц с миллиардами строк.


