Re: Preserve index stats during ALTER TABLE ... TYPE ...
От | Sami Imseih |
---|---|
Тема | Re: Preserve index stats during ALTER TABLE ... TYPE ... |
Дата | |
Msg-id | CAA5RZ0sbZzVP0UQW-hvHhpbG7G0r2fgAdLbiJCLJjLOKscGXTA@mail.gmail.com обсуждение исходный текст |
Ответ на | Preserve index stats during ALTER TABLE ... TYPE ... (Bertrand Drouvot <bertranddrouvot.pg@gmail.com>) |
Ответы |
Re: Preserve index stats during ALTER TABLE ... TYPE ...
|
Список | pgsql-hackers |
Hi, Thanks for raising this issue and for the patch! > As you can see, the index stats (linked to the column that has been altered) are > not preserved. I think that they should be preserved (like a REINDEX does). I agree. > - We can not use pgstat_copy_relation_stats() because the old index is dropped > before the new one is created, so the patch adds a new PgStat_StatTabEntry > pointer in AlteredTableInfo. I wonder if it will be good to have a pgstat_save_relation_stats() routine that gets called in all code paths that will need to restore the stats. This way pgstat_copy_relation_stats can also be used. This will be cleaner than code paths that need this having to deal with pgstat_fetch_stat_tabentry? Have not thought this thoroughly, but it seems like it might be a more general approach. > - The patch adds a few tests to cover multiple scenarios (with and without > rewrites, and indexes with and without associated constraints). The current patch does not work for partitioned tables because the "oldId" is that of the parent index which has no stats. So we are just copying zeros to the new entry. ``` DROP TABLE test_tab; CREATE TABLE test_tab(a int primary key, b int, c int) partition by range (a); CREATE TABLE test_tab_p1 PARTITION OF test_tab FOR VALUES FROM (0) TO (100); CREATE TABLE test_tab_p2 PARTITION OF test_tab FOR VALUES FROM (100) TO (200); CREATE INDEX test_b_idx ON test_tab(b); -- Force an index scan on test_b_idx SELECT * FROM test_tab WHERE b = 2; test=# select indexrelname, idx_scan from pg_stat_all_indexes where indexrelname like '%test%'; indexrelname | idx_scan -------------------+---------- test_tab_p1_pkey | 0 test_tab_p2_pkey | 0 test_tab_p1_b_idx | 1 test_tab_p2_b_idx | 1 (4 rows) test=# ALTER TABLE test_tab ALTER COLUMN b TYPE int; ALTER TABLE test=# select indexrelname, idx_scan from pg_stat_all_indexes where indexrelname like '%test%'; indexrelname | idx_scan -------------------+---------- test_tab_p1_pkey | 0 test_tab_p2_pkey | 0 test_tab_p1_b_idx | 0 test_tab_p2_b_idx | 0 (4 rows) ``` Regards, -- Sami Imseih Amazon Web Services (AWS)
В списке pgsql-hackers по дате отправления: