Postgresql - 显示 INTEGER、BIGINT 的用法

Postgresql - show usage of INTEGER, BIGINT

我有一个很大的 PG 数据库。 有 INTEGER 和 BIGINT 字段。整数具有 mas 最大值 2 147 483 647 和 bigint 9 223 372 036 854 775 807.

如何找到使用率(最大值非常接近)很大(大约 80-90%)的字段以更改字段类型?有什么工具吗?

我可以使用自定义脚本并向数据库进行多次查询,但也许有一个 Linux 工具可以做到这一点。

谢谢。

只有当您所谈论的列是从一个序列中填充时,您的问题才有意义。

如果我没理解错的话,您可以使用此查询来计算可用号码用完的百分比:

SELECT relname AS sequence_name,
       coalesce(nextval(s.oid) /
                CASE a.atttypid
                   WHEN 'smallint'::regtype THEN 32767::numeric
                   WHEN 'integer'::regtype THEN 2147483647::numeric
                   WHEN 'bigint'::regtype THEN 9223372036854775807::numeric
                END, 0) * 100 AS percent_used
FROM pg_class AS s
   JOIN pg_depend AS d ON d.objid = s.oid
   JOIN pg_attribute a ON d.refobjid = a.attrelid
                          AND d.refobjsubid = a.attnum
WHERE s.relkind = 'S'
  AND d.refclassid = 'pg_class'::regclass
  AND d.classid = 'pg_class'::regclass
ORDER BY 2 DESC;

这里假设列和序列之间存在关系,这种关系是为serialbigserial列以及标识列建立的。

这条建议可能来得太晚了,但是您应该始终使用 bigint 来生成密钥,因为这样您就不会 运行 出现 运行 数字不足的危险。

那会更好,我已经将 nextval 更改为 currval - 它不会更改当前序列的计数器。

SELECT relname AS sequence_name,
       coalesce(currval(s.oid) /
                CASE a.atttypid
                   WHEN 'integer'::regtype THEN 2147483647::numeric
                   WHEN 'bigint'::regtype THEN 9223372036854775807::numeric
                   WHEN 'real'::regtype THEN 6::numeric
                   WHEN 'double precision'::regtype THEN 15::numeric
                END, 0) * 100 AS percent_used
FROM pg_class AS s
   JOIN pg_depend AS d ON d.objid = s.oid
   JOIN pg_attribute a ON d.refobjid = a.attrelid
                          AND d.refobjsubid = a.attnum
WHERE s.relkind = 'S'
  AND d.refclassid = 'pg_class'::regclass
  AND d.classid = 'pg_class'::regclass
ORDER BY 2 DESC;