PostgreSQL | Сколько записей в таблице?

PostgreSQL | Сколько записей в таблице?

Как узнать общее количество записей в какой-то таблице в PostgreSQL через агрегатную функцию count()?

SELECT count(*) FROM a.t_d;

Результат работы выражения:

Узнали сколько записей находится в таблице в PostgreSQL
Узнали сколько записей находится в таблице в PostgreSQL

Мы используем команду SELECT, для того, чтобы получить какой-то результат. После команды мы указываем агрегатную функцию count() внутрь которой передаём символ звёздочки. Смысл функции — подсчитывать общее количество записей.

Звёздочка означает максимальное количество столбцов в записи, которые нужно получить — это все столбцы. Это значит, что при обходе таблицы и подсчёте количества записей мы будем учитывать значения во всех ячейках записи. В результате одна запись будет прибавлять наш счётчик на единицу. Звёздочка нужна для того, чтобы не задумываться о названиях столбцов в таблице. Это универсальная форма записи. Воспринимайте звёздочку как одну запись.

Предложение FROM указывает на то место, в котором нам нужно подсчитать количество записей. Так как PostgreSQL является объектной СУБД, то путь до таблицы мы всегда можем описать при помощи цепочки из точек и идентификаторов.

В нашем случае выражение «a.t_d» обозначает путь до таблицы. Слева от точки у нас находится идентификатор «a«, который обозначает название схемы данных в которой нужно отыскать таблицу. Справа от точки находится идентификатор «t_d«, который обозначает название таблицы в которой нужно подсчитать записи.

Внимание!!! У этого способа есть огромный минус. Он очень долгий.

Как только количество записей в вашей таблице перевалит за 100 миллионов, он начнёт зверски «тупить». Вы просто не дождётесь выполнения запроса.

 

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

Работу агрегатной функции можно существенно ускорить, если для подсчёта количества записей в таблице использовать столбец, по которому построен индекс (например, по столбцу первичных ключей).

Всё что нам нужно — это добавить условие WHERE, где мы будем подсчитывать идентификаторы, значения которых не равно нулю.

SELECT count(*) FROM a.t_d WHERE id != 0;

Подсчёт 175 миллионов записей таким способом занимает от 7 до 11 секунд.

 

Как ускорить подсчёт количества записей в таблице в PostgreSQL через дополнительный столбец с индексом

Работу агрегатной функции можно также ускорить, если для подсчёта количества записей в таблице ссылаться на какой-то столбец, по которому построен индекс. Я имею ввиду столбец, который не является первичным ключом. Любой другой столбец с индексом.

 

Как ускорить подсчёт количества записей в таблице в PostgreSQL, через представление pg_class, если точность количества не сильно важна?

У PostgreSQL есть множество процессов, которые поддерживают целостность и работоспособность баз данных. Одним из таких процессов является VACUUM. Он периодически включается и наводит порядок в базе данных.

Если предположить, что он каждый день выполняет свою работу, то можно попробовать получить некоторые результаты из его деятельности. Для этого нужно обратиться к системному каталогу «pg_class«.

Среди всех столбцов данного каталога нас будет интересовать столбец «reltuples«, который хранит число актуальных строк в таблице, используемых планировщиком. Если таблица ещё не подвергалась очистке или анализу, столбец «reltuples» будет содержать —1, указывая на то, что количество строк неизвестно.

SELECT reltuples::bigint
FROM pg_class
WHERE oid = ‘a.t_all_dp‘::regclass;

Быстро получили приблизительное количество записей таблицы в PostgreSQL через представление pg_class
Быстро получили приблизительное количество записей таблицы в PostgreSQL через представление pg_class

Приблизительное количество записей таблицы было получено за «0.028 ms«. Это самый быстрый результат, потому что он был высчитан заранее.

По свой сути системный каталог «pg_class» является материализованным представлением и данные в ячейках уже высчитаны заранее. Мы просто из вынимаем.

Точность данных в этом случае будет зависеть от того, как часто обновляются записи в таблице и как часто выполняется

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Команды SQLhttps://postgrespro.ru/docs/postgresql/15/sql-commands

Команда VACUUMhttps://postgrespro.ru/docs/postgresql/15/sql-vacuum