@mkone112
Проблема — count() выполняется по полчаса.
Я использовал приблизительный подсчет записей вроде:
SELECT reltuples FROM pg_class WHERE relname = "table" Но результат в 300 раз меньше реального — это слишком большая погрешность.
Есть ли способ, быстро подсчитать число записей, без уменьшения скорости записи?
Решения вопроса 0
Ответы на вопрос 6
@BojackHorseman
нет запроса — нет проблемы ©
@krasszen2
@BorisKorobkov
SELECT reltuples FROM pg_class WHERE relname = «table»
Это и есть самый быстрый способ.
Погрешность можно (нужно) уменьшить, если сделать VACUUM или ANALYZE. Подробнее см. https://www.postgresql.org/docs/9.2/row-estimation…
@romesses
Как раз вашу проблему должен решить данный запрос (в рамках использования TimescaleDB):
SELECT h.schema_name, h.table_name, h.id AS table_id, h.associated_table_prefix, row_estimate.row_estimate FROM _timescaledb_catalog.hypertable h CROSS JOIN LATERAL ( SELECT sum(cl.reltuples) AS row_estimate FROM _timescaledb_catalog.chunk c JOIN pg_class cl ON cl.relname = c.table_name WHERE c.hypertable_id = h.id GROUP BY h.schema_name, h.table_name) row_estimate ORDER BY schema_name, table_name;
https://github.com/timescale/timescaledb/issues/525
И заодно проверьте другие TSDB.
Добавлено
Попробуйте через трюк с EXPLAIN:
CREATE FUNCTION row_estimator(query text) RETURNS bigint LANGUAGE plpgsql AS $$DECLARE plan jsonb; BEGIN EXECUTE 'EXPLAIN (FORMAT JSON) ' || query INTO plan; RETURN (plan->0->'Plan'->>'Plan Rows')::bigint; END;$$;
https://www.cybertec-postgresql.com/en/postgresql-…
https://wiki.postgresql.org/wiki/Count_estimate
https://www.citusdata.com/blog/2016/10/12/count-pe…
@Mugenzo
@PretorDH
How to Define an Auto Increment Primary Key in Pos…
При таких больших таблицах важно чтобы была непрерывность индекса.
Это значит, что удалять записи из таких таблиц дурной тон. А из этого следует, что количество записей равно значению следующего индекса. Значит достаточно узнать значение индекса.
