Postgres - 分区表中的近似行数

时间:2015-06-02 09:55:22

标签: sql postgresql database-partitioning

我正在寻找一种近似分区表中行数的方法。由于数据的大小,我想避免使用count(*)。我试过用这个:

SELECT reltuples FROM pg_class WHERE relname = 'my_table_name';

但它始终返回zero。我假设它是因为该表是分区的。

有没有办法使用pg_class/pg_inherits来获取所有分区中的行数?

非常感谢任何想法!

4 个答案:

答案 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