Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在postgres中显示所有非空表_Sql_Postgresql - Fatal编程技术网

Sql 在postgres中显示所有非空表

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 请尝试一下,希望它能帮

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

附言: 我正在分析一个包含数百个表的数据库,并想检测“死亡代码”。 我想,当一个月后桌子还是空的时候,它就不用了

编辑:已解决

谢谢大家!! 最后,此语句似乎输出了我可以使用的统计数据:

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