Postgresql

這個 SQL 片段會重新索引我的 GIN 索引嗎?為什麼要將舊索引重命名為另一個索引?

  • January 11, 2016

我有一個大型 PostgreSQL 9.3 數據庫。一張表上的一個索引非常大,看起來很臃腫。我正在使用pgtoolkit 中的 pgcompact來減少數據庫膨脹,而無需大量表鎖。但是它不會重新索引那個大索引,因為它是一個 GIN 索引。它建議將此 SQL 片段作為重新索引此索引的一種方式。(mytable是表,myindex是索引。myindex只是nodes(bigint)列上的 GIN 索引mytable)。

CREATE INDEX CONCURRENTLY pgcompact_index_17791 ON mytable USING gin (nodes) WITH (fastupdate=off);
BEGIN;
SET LOCAL statement_timeout TO 1000;
ALTER INDEX public.myindex RENAME TO pgcompact_temp_index_17791;
ALTER INDEX public.pgcompact_index_17791 RENAME TO myindex;
END;
DROP INDEX CONCURRENTLY public.pgcompact_temp_index_17791;

這個片段真的會重新索引myindex索引並減少表 索引膨脹嗎?

將舊索引 ( myindex) 重命名為臨時索引 ( pgcompact_temp_index_17791) 的名稱,然後再次重命名它有什麼意義?這不會導致覆蓋目前正在創建的臨時索引,然後只是將其重命名,這意味著myindex根本不會重建?pgtoolkit 的作者似乎知識淵博,但我不明白它是如何工作的,我不想在不了解它的情況下在我的數據庫上執行 SQL。

如果這種方法有效,那麼這和做有什麼區別REINDEX INDEX myindex;

更仔細地查看名稱。 pgcompact_temp_index_17791pgcompact_index_17791不是一回事。

重命名舊索引的原因是您不能在事務中“同時刪除索引”。

引用自:https://dba.stackexchange.com/questions/125882