On Wed, Feb 14, 2024 at 11:58 PM veem v <veema0...@gmail.com> wrote:

>
>
> On Thu, 15 Feb 2024 at 00:43, Adrian Klaver <adrian.kla...@aklaver.com>
> wrote:
>
>> It depends:
>>
>> https://www.postgresql.org/docs/current/sql-altertable.html
>>
>> "Adding a column with a volatile DEFAULT or changing the type of an
>> existing column will require the entire table and its indexes to be
>> rewritten. As an exception, when changing the type of an existing column,
>> if the USING clause does not change the column contents and the old type
>> is either binary coercible to the new type or an unconstrained domain over
>> the new type, a table rewrite is not needed. However, indexes must always
>> be rebuilt unless the system can verify that the new index would be
>> logically equivalent to the existing one. For example, if the collation for
>> a column has been changed, an index rebuild is always required because the
>> new sort order might be different. However, in the absence of a collation
>> change, a column can be changed from text to varchar (or vice versa)
>> without rebuilding the indexes because these data types sort identically.
>> Table and/or index rebuilds may take a significant amount of time for a
>> large table; and will temporarily require as much as double the disk space.
>>
>> "
>>
>>
>> create table int_test(int_fld integer);
>>
>> insert into int_test select * from generate_series(1, 10000, 1);
>>
>>
>> select ctid, int_fld from int_test ;
>>
>> ctid   | int_fld
>> ----------+---------
>>  (0,1)    |       1
>>  (0,2)    |       2
>>  (0,3)    |       3
>>  (0,4)    |       4
>>  (0,5)    |       5
>>  (0,6)    |       6
>>  (0,7)    |       7
>>  (0,8)    |       8
>>  (0,9)    |       9
>>  (0,10)   |      10
>>
>>
>> alter table int_test alter column int_fld set data type bigint;
>>
>> select ctid, int_fld from int_test ;
>>
>>   ctid   | int_fld
>> ----------+---------
>>  (0,1)    |       1
>>  (0,2)    |       2
>>  (0,3)    |       3
>>  (0,4)    |       4
>>  (0,5)    |       5
>>  (0,6)    |       6
>>  (0,7)    |       7
>>  (0,8)    |       8
>>  (0,9)    |       9
>>  (0,10)   |      10
>>
>> update int_test set  int_fld = int_fld;
>>
>> select ctid, int_fld from int_test  order by int_fld;
>>
>> (63,1)    |       1
>>  (63,2)    |       2
>>  (63,3)    |       3
>>  (63,4)    |       4
>>  (63,5)    |       5
>>  (63,6)    |       6
>>  (63,7)    |       7
>>  (63,8)    |       8
>>  (63,9)    |       9
>>  (63,10)   |      10
>>
>>
>> Where ctid is:
>>
>> https://www.postgresql.org/docs/current/ddl-system-columns.html
>>
>>
>>  Thank you so much.
> So as I also tested the same as you posted, there has been no change in
> "ctid" , when I altered the column data type from 'int' to 'bigint' in the
> table, so that means full table rewriting won't happen in such a scenario.
>

It happened when I altered columns from INTEGER to BIGINT.  How do I know?

The disk filled up.

>

Reply via email to