sql—如何为模式的每个表创建“统计信息”(其中statistics表示每个表返回一条记录)

mwngjboj  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(520)

我有一个模式 myschema 其中有几十个表,每个表都包含一个特定的列 maincolumn . 我想创建整个模式的统计信息,在这里可以看到 maincolumn 每一张table。
我知道我可以作为此查询的结果列出架构中的表:

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 查询到每个表,然后我可以逐行运行它,但我更喜欢一种更简单的方法。

tag5nh1u

tag5nh1u1#

为此,您可能需要动态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 第一。

相关问题