Postgresql
這個 SQL 片段會重新索引我的 GIN 索引嗎?為什麼要將舊索引重命名為另一個索引?
我有一個大型 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_17791
和pgcompact_index_17791
不是一回事。重命名舊索引的原因是您不能在事務中“同時刪除索引”。