Increasing a NUMERIC column precision doesn't cause a table rewrite. Why?
| От | Marcelo Fernandes |
|---|---|
| Тема | Increasing a NUMERIC column precision doesn't cause a table rewrite. Why? |
| Дата | |
| Msg-id | CAM2F1VNniBN2RK9+DD8Pwz4tphE-1w3hZgtwZF-6c08--6JLiw@mail.gmail.com обсуждение исходный текст |
| Ответы |
Re: Increasing a NUMERIC column precision doesn't cause a table rewrite. Why?
Re: Increasing a NUMERIC column precision doesn't cause a table rewrite. Why? Re: Increasing a NUMERIC column precision doesn't cause a table rewrite. Why? Re: Increasing a NUMERIC column precision doesn't cause a table rewrite. Why? |
| Список | pgsql-general |
Hi everyone, A numeric field is defined as: NUMERIC(precision, scale) [0]. After doing some playing around with different operations against a numeric column, namely: increasing/decreasing the precision or increasing/decreasing the scale, I noticed that the table is rewritten in all cases except when increasing the precision number. Take the following snippet as example (tested on postgres 15): ```sql CREATE DATABASE test_precision_field; -- \c test_precision_field SET client_min_messages=debug1; DROP TABLE IF EXISTS foo; CREATE TABLE foo (id SERIAL PRIMARY KEY, bar NUMERIC(10, 2)); -- Only increase precision but keep the scale: -- This does not rewrite the table ALTER TABLE foo ALTER COLUMN bar TYPE numeric(20, 2); -- Only decrease the precision but keep the scale: -- This rewrites the table. ALTER TABLE foo ALTER COLUMN bar TYPE numeric(10, 2); -- DEBUG: rewriting table "foo" -- DEBUG: building index "foo_pkey" on table "foo" serially -- DEBUG: index "foo_pkey" can safely use deduplication -- Only increase the scale, but keep the precision: -- This rewrites the table. ALTER TABLE foo ALTER COLUMN bar TYPE numeric(10, 4); -- DEBUG: rewriting table "foo" -- DEBUG: building index "foo_pkey" on table "foo" serially -- DEBUG: index "foo_pkey" can safely use deduplication -- Only decrease the scale, but keep the precision: -- This rewrites the table. ALTER TABLE foo ALTER COLUMN bar TYPE numeric(10, 2); -- DEBUG: rewriting table "foo" -- DEBUG: building index "foo_pkey" on table "foo" serially -- DEBUG: index "foo_pkey" can safely use deduplication ``` My assumption is that once the precision is increased, Postgres can still interpret the old values that were generated with a lower precision, whereas this is not possible for any other types of changes on the numeric field. Is that assumption correct? How can I verify it? For example, is there a catalog table I can have a look to see how these values are defined, along with some form of documentation to understand how they are interpreted by Postgres? Thank you, Marcelo. - [0] https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL
В списке pgsql-general по дате отправления: