Как узнать общее количество записей в какой-то таблице в PostgreSQL через агрегатную функцию count()?
SELECT count(*) FROM a.t_d;
Результат работы выражения:
Мы используем команду 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;
Приблизительное количество записей таблицы было получено за «0.028 ms«. Это самый быстрый результат, потому что он был высчитан заранее.
По свой сути системный каталог «pg_class» является материализованным представлением и данные в ячейках уже высчитаны заранее. Мы просто из вынимаем.
Точность данных в этом случае будет зависеть от того, как часто обновляются записи в таблице и как часто выполняется
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Команды SQL — https://postgrespro.ru/docs/postgresql/15/sql-commands
Команда VACUUM — https://postgrespro.ru/docs/postgresql/15/sql-vacuum