如何统计数据库中所有物化视图的记录数?现有代码无法返回结果
解决PostgreSQL物化视图记录数统计的问题
我看了你的PL/pgSQL代码,问题主要出在这几个地方:
- 你把所有物化视图的计数都存在同一个变量
my_pk_new里,循环结束后这个变量只会保留最后一个物化视图的结果,自然看不到所有视图的统计数据 EXECUTE语句里的from后面没加空格,会导致SQL语法错误(比如变成frommatviewA这种无效语句)- 你只在循环结束后输出一次结果,没法逐个展示每个物化视图的计数
这里给你修正后的代码,完全能实现你想要的输出效果:
DO $$ DECLARE rec record; mv_count bigint; -- 用bigint避免大计数溢出 BEGIN FOR rec IN SELECT matviewname FROM pg_matviews LIMIT 2 LOOP -- 修复from后的空格问题,同时把计数存入变量 EXECUTE 'SELECT count(*) FROM ' || rec.matviewname INTO mv_count; -- 循环内直接输出每个物化视图的名称和计数 RAISE NOTICE '% %', rec.matviewname, mv_count; END LOOP; END; $$ LANGUAGE plpgsql;
如果不想用额外变量,也可以直接在EXECUTE里拼接输出逻辑,这样更简洁,还能避免视图名带特殊字符的问题:
DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT matviewname FROM pg_matviews LIMIT 2 LOOP EXECUTE format('RAISE NOTICE ''%s %%s'', (SELECT count(*) FROM %I)', rec.matviewname, rec.matviewname); END LOOP; END; $$ LANGUAGE plpgsql;
这里用format()函数和%I占位符更安全,能自动处理物化视图名称包含空格、关键字等特殊情况,避免语法错误。
内容的提问来源于stack exchange,提问作者Doe
相关产品推荐
相关产品推荐

