【问题标题】:How to create "statistics" for every table of a schema? (where statistics means 1 returned record per each table)如何为模式的每个表创建“统计信息”? (其中统计信息表示每个表返回 1 条记录)
【发布时间】:2020-11-06 22:20:33
【问题描述】:

我有一个架构myschema,其中有几十个表,每个表都包含一个特定的列maincolumn。我想创建整个架构的统计信息,我可以在其中查看每个表的 maincolumn 中有多少不同的值。

我知道我可以通过这个查询列出架构中的表:

SELECT tablename 
FROM pg_tables 
WHERE schemaname = 'myschema'

结果:

tablename
---------
table1
table2
table3
...

我还可以为每个表运行查询:

SELECT COUNT(DISTINCT(maincolumn))  
FROM myschema.table1

结果:

count
-----
2972

但我想知道是否有办法将这两个任务合并到一个查询中,结果会是这样:

tablename | count
----------+------
table1    | 2972 
table2    |  542 
table3    | 1523 
....

一个不太优雅的解决方案是列出我所有的表,将结果放入 Excel 表中并使用 CONCATENATE 函数为每个表创建一个 SELECT 查询,然后我可以逐行运行它,但我更喜欢更简单的方法。

【问题讨论】:

    标签: sql postgresql statistics


    【解决方案1】:

    为此,您需要动态 SQL,可能在这样的 PL/pgSQL 函数中:

    CREATE OR REPLACE FUNCTION table_counts() RETURNS TABLE (table_name text, count bigint)
       LANGUAGE plpgsql AS
    $$BEGIN
       FOR table_counts.table_name IN
          SELECT t.table_name
          FROM information_schema.tables AS t
          WHERE t.table_schema = 'myschema'
            AND t.table_type = 'BASE TABLE'
       LOOP
          EXECUTE format(
                     'SELECT count(*) FROM myschema.%I',
                     table_counts.table_name
                  ) INTO table_counts.count;
    
          RETURN NEXT;
       END LOOP;
    END;$$;
    

    而且,这很贵。

    如果近似计数对您来说足够好,请尝试

    SELECT c.relname, c.reltuples
    FROM pg_catalog.pg_class AS c
       JOIN pg_catalog.pg_namespace AS n
          ON c.relnamespace = n.oid
    WHERE n.nspname = 'myschema'
      AND c.relkind = 'r';
    

    如果你先运行ANALYZE,结果会更准确。

    【讨论】:

    • 是的,看来我得写一个函数了。我试过你的代码,但它说type "regnamespace" does not exist。我检查了pg_catalog.pg_classregnamespace列的类型,类型是oid。无论如何感谢您的回答。我会尝试编写函数并在完成后将其发布在这里。
    • 您必须使用旧的 PostgreSQL 版本。我已经调整了我的查询并添加了一个功能,如果您不介意费用,可以使用该功能。
    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多