Sql Postgres—分区表中的近似行数

Sql Postgres—分区表中的近似行数,sql,postgresql,database-partitioning,Sql,Postgresql,Database Partitioning,我正在寻找一种方法来近似计算分区表中的行数。由于数据的大小,我希望避免使用count*。我试着用这个: SELECT reltuples FROM pg_class WHERE relname = 'my_table_name'; 但它总是返回零。我想这是因为那个表是分区的 有没有办法使用pg_类/pg_继承来获取所有分区中的行数 任何想法都非常感谢 找到了这样做的方法: SELECT SUM(child.reltuples) AS

我正在寻找一种方法来近似计算分区表中的行数。由于数据的大小,我希望避免使用count*。我试着用这个:

SELECT reltuples FROM pg_class WHERE relname = 'my_table_name';
但它总是返回零。我想这是因为那个表是分区的

有没有办法使用pg_类/pg_继承来获取所有分区中的行数


任何想法都非常感谢

找到了这样做的方法:

            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';

我还使用了system ANALYZE命令,以及表与其分区之间的父/子关系。

找到了一种方法:

            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';

我还使用system ANALYZE命令,以及表与其分区之间的父/子关系。

如果要正确处理多级继承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;

如果要正确处理多级继承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;

简单的方法是,如果子分区遵循命名方案:

SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
where relname like 'my_table_%'
ORDER BY relname DESC ;

简单的方法是,如果子分区遵循命名方案:

SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
where relname like 'my_table_%'
ORDER BY relname DESC ;

这一个对我来说适用于哈希分区表:

SELECT sum(reltuples)::int8
FROM pg_catalog.pg_class
WHERE relispartition = true
    AND reltype != 0 -- ignore indexes

这一个对我来说适用于哈希分区表:

SELECT sum(reltuples)::int8
FROM pg_catalog.pg_class
WHERE relispartition = true
    AND reltype != 0 -- ignore indexes

如何计算数据库中的行数您必须找到所有直接和间接继承递归CTE,然后将每个CTE的统计估计相加。谢谢!我找到了一种使用继承的方法,并将其发布在了一个答案中。如何计算数据库中的行数您必须找到所有直接和间接继承递归CTE,然后将每个CTE的统计估计相加。谢谢!我找到了一种使用继承的方法,并将其发布在了一个答案中。但是在分区中会出现这种情况吗?@Sanuye:理论上,是的。但是在分区中会出现这种情况吗?@Sanuye:理论上,是的。这非常好!我想让它成为一个sub-select或某种类型的连接,即使表不是继承的,也能工作。这非常好!我想让它成为一个sub-select或某种类型的连接,即使表不是继承的,也能正常工作。