我正在寻找一种近似分区表中行数的方法。由于数据的大小,我想避免使用count(*)
。我试过用这个:
SELECT reltuples FROM pg_class WHERE relname = 'my_table_name';
但它始终返回zero
。我假设它是因为该表是分区的。
有没有办法使用pg_class/pg_inherits
来获取所有分区中的行数?
非常感谢任何想法!
答案 0 :(得分:4)
简单来说,如果子分区遵循命名方案:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
答案 1 :(得分:2)
如果你想正确处理多个级别的继承(c继承b继承a),那么你需要一个递归查询:
WITH RECURSIVE tree AS
(
SELECT i.inhrelid AS oid
FROM pg_inherits i
JOIN pg_class base_t ON i.inhparent = base_t.oid
JOIN pg_namespace base_ns ON base_t.relnamespace = base_ns.oid
WHERE base_ns.nspname = 'base_schema'
AND base_t.relname = 'base_table_name'
UNION ALL
SELECT i.inhrelid AS oid
FROM pg_inherits i
JOIN tree b ON i.inhparent = b.oid
JOIN pg_class cl on cl.oid = i.inhrelid
)
SELECT sum(tbl.reltuples)
FROM tree tr
JOIN pg_class tbl ON tr.oid = tbl.oid;
答案 2 :(得分:1)
找到了一种方法:
SELECT
SUM(child.reltuples) AS number_of_records_all_partitions
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname = 'my_table_name';
我也在使用系统ANALYZE命令,以及表和它的分区之间的父/子关系。
答案 3 :(得分:0)
这个对我来说适用于哈希分区表:
SELECT sum(reltuples)::int8
FROM pg_catalog.pg_class
WHERE relispartition = true
AND reltype != 0 -- ignore indexes