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;
这里假设列和序列之间存在关系,这种关系是为serial
和bigserial
列以及标识列建立的。
这条建议可能来得太晚了,但是您应该始终使用 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;
我有一个很大的 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;
这里假设列和序列之间存在关系,这种关系是为serial
和bigserial
列以及标识列建立的。
这条建议可能来得太晚了,但是您应该始终使用 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;