| PostgreSQL | ||
|---|---|---|
| 上一頁 | 下一頁 | |
CLUSTER ─ Gives storage clustering advice to the server
CLUSTER indexname ON table
CLUSTER 指示 Postgres 近似的基於索引 indexname 的度量對表 table 進行儲存建簇。索引必須已經在表 table 上定義了。
當對一個表建簇後,該表的物理儲存將基於索引資訊進行。建簇是靜態的,也就是說,當表被更新後,改變的內容不會建簇。不會試圖對更新過的記錄重新建簇。如果需要,可以通過手工執行該命令的方法重建簇。
該表實際上按索引順序拷貝到了一個臨時表中,然後重新改成原名。因此,在建簇時所有賦予的權限和其它索引都將丟失。
如果你只是隨機的訪問表中的行,那麼在堆表中的數據的實際儲存順序是無關緊要的。但是,如果你對某些數據的訪問多於其他數據,而且有一個索引將這些數據分組,那你就將從 CLUSTER 中獲益。
另一個 CLUSTER 很有幫助的例子是當你用索引從一個表中取出幾個記錄時.如果你從一個表中請求一定索引範圍的值,或者是一個索引過的值對應多行,CLUSTER 也會有助於應用,因為如果索引標識出第一匹配行所在的堆儲存頁,所有其他行也可能已經在同一堆儲存頁裡了,這樣便節省了硬碟訪問的時間,加速了查詢。
有兩種建簇的數據。第一種是用 CLUSTER 命令,此命令將原表按你聲明的索引重新排列。這個動作在操作大表時可能會很慢,因為每一行都從堆儲存頁裡按索引順序取出,如果儲存頁表沒有排序,整個表是隨機存放在各個頁面的,因而每行都要進行依次硬碟頁面操作。Postgres 有一個緩沖,但一個大表的主體是不可能都放到緩沖去的。
另一個對數據建簇的方法是使用
SELECT columnlist INTO TABLE newtable
FROM table ORDER BY columnlist
這個用法使用 Postgres 排序的程式碼 ORDER BY 來匹配索引,在對未排序的數據操作時速度快得多。然後你可以刪除舊表,用 ALTER TABLE/RENAME 將 temp 改成舊表名,並且重建所有索引。唯一的問題是 OID 將不保留。這時再做 CLUSTER 將快得多,因為大多數堆疊數據已經排過序了而且使用現有的索引。
以雇員的薪水屬性對雇員關系建簇。
CLUSTER emp_ind ON emp;
在 SQL92 規範裡沒有 CLUSTER 語句。
| 上一頁 | 首頁 | 下一頁 |
| CLOSE | 開頭 | COMMIT |