1. 程式人生 > >第二章 SQL命令參考-REINDEX

第二章 SQL命令參考-REINDEX

Rebuildsindexes.

概要

REINDEX {INDEX| TABLE | DATABASE | SYSTEM} name

描述

REINDEX使用索引表中儲存的資料重建索引,替換索引的舊副本。 有幾種場景使用REINDEX:

•索引變得臃腫,它包含許多空的或幾乎空的頁面。 在某些不常見的訪問模式下,可能會發生在Greenplum資料庫中的B樹索引。 REINDEX提供了一種通過在沒有死頁面的情況下編寫新版本的索引來減少索引的空間消耗的方法。

•您已經更改了索引的fillfactor儲存引數,並希望確保更改已完全生效。

parameter

INDEX

重新建立指定的索引。

TABLE

重新建立指定表的所有索引。如果表具有輔助TOAST表,那麼也是重新索引。

DATABASE

重新建立當前資料庫中的所有索引。共享系統目錄的索引將被跳過。這種形式的REINDEX不能在事務塊內執行。

SYSTEM

在當前資料庫中重新建立系統目錄上的所有索引。不處理使用者表的索引。此外,跳過共享(全域性)系統目錄上的索引。這種形式的REINDEX不能在事務塊內執行。

name

要重建索引的特定索引,表或資料庫的名稱。索引和表名可能是模式限定的。目前,REINDEX DATABASE和REINDEX SYSTEM只能重新索引當前資料庫,所以它們的引數必須與當前資料庫的名稱相匹配。

Notes

REINDEX類似於索引的刪除和重新建立,因為索引內容從頭開始重新構建。然而,鎖定的考慮是相當不同的。 REINDEX鎖定了索引的父表的寫入,但不會讀取索引的父表。它還需要對正在處理的特定索引進行排他鎖定,這將阻止嘗試使用該索引的讀取。相比之下,DROP INDEX暫時在父表上排除鎖定,阻止寫入和讀取。後續的CREATE INDEX鎖定寫入但不讀取;由於索引不存在,所以沒有讀取將嘗試使用它,這意味著將不會有阻塞,但讀取可能被迫進行昂貴的順序掃描。另一個重要的一點是,drop / create方法使使用該索引的任何快取的查詢計劃無效,而REINDEX則沒有。

重新索引單個索引或表需要該索引或表的所有者。重建資料庫需要資料庫的所有者(注意,所有者可以重建其他使用者擁有的表的索引)。當然,超級使用者總是可以重新索引任何東西。

如果您懷疑共享的全域性系統目錄索引已損壞,則只能在Greenplum實用程式模式下重新建立索引。損壞的共享索引的典型症狀是“索引不是btree”錯誤,否則由於依賴損壞的索引,伺服器在啟動時立即崩潰。在此情況下,請聯絡Greenplum客戶支援以獲得幫助。

示例

Rebuild asingle index:

REINDEX INDEXmy_index;

Rebuild allthe indexes on the table my_tabie:

REINDEX TABLEmy_table;

相容性

There is no REINDEX command in the SQL standard.

相關參考

CREATE INDEX, DROP INDEX, VACUUM