Sql 在postgres中显示所有非空表
是否有一种简单的PostgreSQL甚至SQL方式来列出空/非空表 附言: 我正在分析一个包含数百个表的数据库,并想检测“死亡代码”。 我想,当一个月后桌子还是空的时候,它就不用了 编辑:已解决 谢谢大家!! 最后,此语句似乎输出了我可以使用的统计数据:Sql 在postgres中显示所有非空表,sql,postgresql,Sql,Postgresql,是否有一种简单的PostgreSQL甚至SQL方式来列出空/非空表 附言: 我正在分析一个包含数百个表的数据库,并想检测“死亡代码”。 我想,当一个月后桌子还是空的时候,它就不用了 编辑:已解决 谢谢大家!! 最后,此语句似乎输出了我可以使用的统计数据: select schemaname, relname, n_tup_ins from pg_stat_all_tables WHERE schemaname = 'public' ORDER BY n_tup_ins 请尝试一下,希望它能帮
select schemaname, relname, n_tup_ins from pg_stat_all_tables WHERE schemaname = 'public' ORDER BY n_tup_ins
请尝试一下,希望它能帮助您:
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
你可以这样做
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,这意味着它们是空表。您可以使用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
返回一个依赖于会话的值,因此您必须确保没有其他人在使用数据库,并同时使用nextval
和setval
)
(不幸的是,我还没有找到任何方法来确定哪个序列属于哪个表。显然这将非常有用。无论如何,您可以使用pg_class.relnamespace
来缩小结果的范围。)
有关详细信息,请参阅。检查行数可能会得到错误的结果。假设一个表用作暂存表:插入行(例如从平面文件)、处理和删除行。如果检查该表中的行数,如果在处理过程中没有运行查询,则很可能会认为该表从未使用过 检测“未使用”表的另一种方法是监视IO和对表所做的更改 统计视图记录系统中每个表的更改(删除、插入、更新)。统计视图记录针对表执行的IO 如果定期拍摄这些表的快照,则可以计算值之间的差异,并查看是否使用了表
您可以使用
pg_stat_reset()
将所有值重置为零,然后从零开始。是否希望按特定日期查看未使用的表或空表?如果出于有效原因删除了表中的所有行,会发生什么情况?就像有任务一样,所有任务都成功完成,然后从表中删除。如果您删除该表,而有人试图创建新任务,该怎么办?@user1474602:空表,那些从未被写访问过的表。@LajosArpad:我没有说过,我将删除这些表。只是想知道该看哪一个是的,从pg_stat_all_表获取信息似乎是一个好方法:PostgreSQL的statistics collector是一个子系统,它支持收集和报告有关服务器活动的信息。目前,收集器可以在磁盘块和单个行中统计对表和索引的访问。它还跟踪每个表中的总行数,以及每个表的真空和分析操作信息。。。谢谢你的快速回复。不幸的是,我得到了“错误:模式“sys”不存在”需要对代码进行一点细化我想是的,我已经使用了这一点,这就是为什么发布了相同的内容。@ValentinHeinitz我已经检查了这一点,它工作得很好。请在您的末端检查一次,即检查其他数据库,该查询对Postgres无效(看起来像SQL Server/T-SQL查询),它是一个“SQL Server"质询SQL
只是一种查询语言,而不是DBMS产品。标签sql server
用于特定于sql server的查询。标签sql
通常只将sql作为一种查询语言引用。谢谢。很遗憾,没有找到行。我刚刚意识到,我做了一件非常愚蠢的事。在生产数据库上运行包含创建/删除的查询。我希望我没有破坏任何东西。不,这将创建临时表,并删除相同的。没有别的,所以不用担心
SELECT n.nspname, c.relname
FROM pg_class c
INNER JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relkind = 'S';