Postgresql - показать использование INTEGER, BIGINT - PullRequest
0 голосов
/ 21 апреля 2020

У меня большая база данных PG. Есть поля INTEGER и BIGINT. Целое число имеет значение max max 2 147 483 647 и bigint 9 223 372 036 854 775 807.

Как найти поля, в которых использование (максимальное значение очень близко) велико (около 80-90%) для изменить тип поля? Есть ли какие-нибудь инструменты для этого?

Я могу использовать собственный скрипт и делать много запросов к БД, но, может быть, есть Linux инструменты для этого.

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Ваш вопрос имеет смысл, только если столбцы, о которых вы говорите, заполнены из последовательности.

Если я вас правильно понял, вы можете использовать этот запрос, чтобы выяснить, на сколько процентов исчерпаны доступные числа:

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 для сгенерированных ключей, потому что тогда вы никогда не столкнетесь с опасностью нехватки чисел.

0 голосов
/ 22 апреля 2020

Это будет лучше, я изменил 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...