天天看點

第二章 SQL指令參考-REINDEX

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