繁体   English   中英

在postgres中显示所有不是空表

[英]show all not empty tables in postgres

是否有简单的PostgreSQL甚至SQL方式列出空/非空表?

PS:我正在分析一个包含数百个表的数据库,并希望检测“死亡代码”。 我假设,当一个月后的桌子仍然是空的,而不是它没有使用。

编辑:解决

谢谢你们! 最后,这句话似乎输出了我可以使用的统计数据:

select schemaname, relname, n_tup_ins from pg_stat_all_tables WHERE schemaname = 'public' ORDER BY n_tup_ins 

你可以使用PostgreSQL的系统目录

SELECT n.nspname, c.relname
FROM pg_class c
INNER JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.reltuples = 0 AND c.relkind = 'r';

根据文档,行数是一个估计值。

如果您的表具有从序列中获取其默认值的列,则可以列出它们并使用nextval检查它们的值。 (不幸的是, currval返回一个与会话相关的值,所以你必须确保没有其他人在使用数据库并使用nextvalsetval 。)

SELECT n.nspname, c.relname
FROM pg_class c
INNER JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relkind = 'S';

(不幸的是我还没有找到任何方法来确定哪个序列属于哪个表。显然它会非常有用。无论如何,你可以使用pg_class.relnamespace来缩小结果范围。)

有关详细信息,请参见http://www.postgresql.org/docs/9.3/interactive/catalogs-overview.html

检查行数可能会给您错误的结果。 假设一个表用作临时表:行插入(例如从平面文件中),处理和删除。 如果您检查该表中的行数,那么如果您在处理过程中没有碰巧运行查询,那么您很可能会认为它从未被使用过。

检测“未使用”表的另一种方法是监视IO和对表执行的更改。

统计视图pg_stat_user_tables记录对系统中每个表的更改(删除,插入,更新)。 统计视图pg_statio_user_tables记录对表执行的IO。

如果以固定间隔拍摄这些表的快照,则可以计算值的差异,并查看是否使用了表。

您可以使用pg_stat_reset()将所有值重置为零,然后从该值开始。

你可以这样做

CREATE OR REPLACE FUNCTION fn_table()
  RETURNS TABLE(name text,count int) AS
$BODY$
DECLARE
    data record;
    v_sql text;
BEGIN
    DROP TABLE IF EXISTS demo;
    CREATE TEMP TABLE demo (name text,count int);
    FOR data in (SELECT table_name FROM INFORMATION_SCHEMA.tables WHERE table_schema = 'public')    LOOP
        v_sql := 'INSERT INTO demo SELECT '''||data.table_name||''', COUNT(*) FROM '||data.table_name;
        RAISE INFO 'v_sql:%',v_sql;
        EXECUTE v_sql;
    END LOOP;
    RETURN QUERY (SELECT * FROM demo);
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

输出:

"child";0
"location_master";6
"location";5
"tmp";5
"a1";7
"b1";3
"master";0
"child2";0
"child1";0

这里child,master,child1,child2有0个计数,这意味着它们是空表。

请尝试一次,希望它可以帮助您:

Running the query below will give you a list of tables and indexes that have not been used since SQL Server was last restarted. Once you have a list of tables, you can do a dependency check to get a list of stored procedures that use each table. Then you can search your C# source code for thos SPs and table names.



-- Unused tables & indexes. Tables have index_id’s of either 0 = Heap table or 1 = Clustered Index

SELECT OBJECTNAME = OBJECT_NAME(I.OBJECT_ID), INDEXNAME = I.NAME, I.INDEX_ID

FROM SYS.INDEXES AS I

INNER JOIN SYS.OBJECTS AS O

ON I.OBJECT_ID = O.OBJECT_ID

WHERE OBJECTPROPERTY(O.OBJECT_ID,'IsUserTable') = 1

AND I.INDEX_ID

NOT IN (SELECT S.INDEX_ID

FROM SYS.DM_DB_INDEX_USAGE_STATS AS S

WHERE S.OBJECT_ID = I.OBJECT_ID

AND I.INDEX_ID = S.INDEX_ID

AND DATABASE_ID = DB_ID(db_name()))

ORDER BY OBJECTNAME, I.INDEX_ID, INDEXNAME ASC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM