本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
VACUUM
在指定的資料表中或目前資料庫的所有資料表中,重新排序資料列並回收空間。
注意
只有具有必要資料表權限的使用者才能有效地清除資料表。如果 VACUUM 在沒有必要的資料表許可的情況下執行,則操作已成功完成,但沒有效果。如需有效執行 的有效資料表許可清單VACUUM,請參閱下列必要權限章節。
Amazon Redshift 會自動排序資料並在背景VACUUMDELETE執行。這可減少執行 VACUUM 命令的需要。如需詳細資訊,請參閱清空資料表。
根據預設, 會VACUUM略過任何資料表的排序階段,其中已排序資料表列的 95% 以上。跳過排序階段可以大幅改善VACUUM效能。若要變更單一資料表的預設排序或刪除閾值,請在執行 時包含資料表名稱和 TO 閾值PERCENT參數VACUUM。
使用者可以在清空資料表時加以存取。您可以在將資料表清空時執行查詢和寫入操作,但當資料操作語言 (DML) 命令和真空同時執行時,兩者可能需要更長的時間。如果您在真空期間執行 UPDATE和 DELETE陳述式,系統效能可能會降低。VACUUM DELETE 暫時封鎖更新和刪除操作。
Amazon Redshift 會自動在背景執行DELETEONLY吸塵。當使用者執行資料定義語言 (DDL) 操作時,自動清空操作會暫停,例如 ALTER TABLE。
注意
Amazon Redshift VACUUM命令語法和行為與 PostgreSQL VACUUM操作大不相同。例如,Amazon Redshift 中的預設VACUUM操作為 VACUUM FULL,這會回收磁碟空間並重新排序所有資料列。相反地,PostgreSQL 中的預設VACUUM操作只會回收空間,並使其可供重複使用。
如需詳細資訊,請參閱清空資料表。
所需權限
以下是 的必要權限VACUUM:
超級使用者
具有 VACUUM權限的使用者
資料表擁有者
共用資料表的資料庫擁有者
語法
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ] [ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
參數
- FULL
-
排序指定的資料表 (或目前資料庫中的所有資料表),並擷取先前 UPDATE和 DELETE操作標記為刪除的資料列所佔用的磁碟空間。VACUUM FULL 為預設值。
完整清空並不會對交錯資料表執行重新建立索引。若要在完整清空之後重新建立交錯資料表的索引,請使用 VACUUM REINDEX 選項。
根據預設, 會VACUUMFULL略過已排序至少 95% 的任何資料表的排序階段。如果 VACUUM 能夠略過排序階段,它會在刪除階段執行 DELETEONLY並回收空間,這樣就不會將至少 95% 的剩餘資料列標記為刪除。
如果未達到排序閾值 (例如,如果 90% 的資料列已排序) 並VACUUM執行完整排序,則它也會執行完整的刪除操作,從 100% 的已刪除資料列中復原空間。
您只能變更單一資料表的預設清空閾值。若要變更單一資料表的預設真空閾值,請包含資料表名稱和 TO 閾值PERCENT參數。
- SORT ONLY
-
排序指定的資料表 (或目前資料庫中的所有資料表),但不回收已刪除資料列釋出的空間。當回收磁碟空間不重要,但重新排序新資料列很重要時,此選項很實用。當未排序的區域不包含大量已刪除的資料列,且未跨越整個排序區域時,SORTONLY真空會減少真空操作的經過時間。若應用程式沒有磁碟空間限制條件,但須倚賴與保持資料表資料列排序狀態相關聯的查詢最佳化,則可受益於這類清空。
根據預設, 會VACUUMSORTONLY略過已排序至少 95% 的任何資料表。若要變更單一資料表的預設排序閾值,請在執行 時包含資料表名稱和 TO 閾值PERCENT參數VACUUM。
- DELETE ONLY
-
Amazon Redshift 會自動在背景執行DELETEONLY吸塵,因此您很少需要執行DELETEONLY吸塵。
會VACUUMDELETE回收被先前 UPDATE和 DELETE操作標記為刪除的資料列佔用的磁碟空間,並壓縮資料表以釋放耗用空間。DELETE ONLY 真空操作不會排序資料表資料。
當回收磁碟空間很重要,但重新排序新資料列不重要時,此選項可縮短清空操作的經過時間。當您的查詢效能已達最佳狀態,而不需要重新排序資料列來最佳化查詢效能時,此選項也很實用。
依預設, VACUUM DELETE ONLY 會回收空間,讓至少 95% 的剩餘資料列不會標記為刪除。若要變更單一資料表的預設刪除閾值,請在執行 時包含資料表名稱和 TOthresholdPERCENT 參數VACUUM。
某些操作 (如
ALTER TABLE APPEND
) 可能造成資料表遭切割成片段。當您使用DELETE ONLY
子句時,清空操作會回收片段資料表的空間。重組操作同樣會套用 95% 的閾值。 - REINDEX tablename
-
分析交錯排序索引鍵欄中的值分佈,然後執行完整VACUUM操作。REINDEX 如果使用 ,則需要資料表名稱。
VACUUM REINDEX 花費的時間遠超過 ,VACUUMFULL因為它會進行額外的傳遞來分析交錯的排序金鑰。交錯資料表的排序和合併操作可能需要更長的時間,因為交錯排序可能需要重新排列比複合排序更多的資料列。
如果VACUUMREINDEX操作在完成之前終止,則下一個 會在執行完整真空操作之前VACUUM繼續重新索引操作。
VACUUM REINDEX 不支援 TO 閾值 PERCENT。
- table_name
-
要清空的資料表名稱。如果您未指定資料表名稱,則清空操作會套用至目前資料庫中的所有資料表。您可以指定任何使用者建立的永久或臨時資料表。此命令對於其他物件並無意義,例如檢視和系統資料表。
如果您包含 TO 閾值PERCENT參數,則需要資料表名稱。
- RECLUSTER 資料表名稱
-
排序資料表中未排序的部分。已依自動資料表排序排序的資料表部分會保持不變。此命令不會將新排序的資料與已排序的區域合併。也不會回收標記為刪除的所有空間。當此命令完成時,資料表可能不會完全排序,如 SVV_TABLE_ 中的
unsorted
欄位所示INFO。建議您VACUUMRECLUSTER將 用於經常擷取和查詢且僅存取最新資料的大型資料表。
VACUUM RECLUSTER 不支援 TO 閾值 PERCENT。RECLUSTER 如果使用 ,則需要資料表名稱。
VACUUM RECLUSTER 在具有交錯排序索引鍵的資料表和具有ALL分佈樣式的資料表上不支援 。
- table_name
-
要清空的資料表名稱。您可以指定任何使用者建立的永久或臨時資料表。此命令對於其他物件並無意義,例如檢視和系統資料表。
- 結束閾值 PERCENT
-
指定上述閾值的子句,其會VACUUM略過排序階段,以及用於在刪除階段中回收空間的目標閾值。排序閾值是清空之前,指定資料列中已依照排序順序排列的總列數百分比。 刪除閾值是清空之後,未標記為要進行刪除的總列數百分比下限。
由於只有在資料表中排序資料列的百分比低於排序閾值時,VACUUM才會重新排序資料列,因此 Amazon Redshift 通常可以大幅縮短VACUUM時間。同樣地,當 VACUUM 沒有限制從 100% 標記為刪除的資料列中回收空間時,通常可以略過僅包含幾個已刪除資料列的重寫區塊。
例如,如果您為閾值 指定 75,則如果資料表的 75% 或更多資料列已按排序順序排列,則 會VACUUM略過排序階段。對於刪除階段, VACUUMS會設定回收磁碟空間的目標,使得至少 75% 的資料表資料列在真空之後不會標記為刪除。閾值必須是介於 0 到 100 之間的整數。預設為 95。如果您指定 100 的值, VACUUM一律會排序資料表,除非資料表已完全排序,並從標記為刪除的所有資料列中回收空間。如果您指定 0 的值,則VACUUM絕不會排序資料表,也絕不會回收空間。
如果您包含 TO 閾值PERCENT參數,則還必須指定資料表名稱。如果省略資料表名稱, 會VACUUM失敗。
您無法搭配 使用 TO 閾值PERCENT參數REINDEX。
- BOOST
-
使用可用的其他資源執行VACUUM命令,例如記憶體和磁碟空間。透過 BOOST選項, 在一個視窗中VACUUM操作,並在VACUUM操作期間封鎖並行刪除和更新。使用 BOOST選項執行 會爭用系統資源,這可能會影響查詢效能。在系統上負載很亮VACUUMBOOST時執行 ,例如在維護操作期間。
使用 BOOST選項時,請考慮下列事項:
-
指定 BOOST 時,需要 table_name 值。
-
BOOST 不支援 REINDEX。
-
BOOST 會以 DELETE 忽略ONLY。
-
使用須知
對於大多數 Amazon Redshift 應用程式,建議您執行完整清空。如需詳細資訊,請參閱清空資料表。
在執行清空操作之前,請注意以下行為:
-
您無法在交易區塊VACUUM內執行 (BEGIN ... END)。如需交易的相關資訊,請參閱 可序列化隔離。
-
您可以隨時在叢集上執行一個VACUUM命令。若您嘗試同時執行多個清空操作,Amazon Redshift 會傳回錯誤。
-
當資料庫清空時,資料庫可能會稍微擴大。在沒有刪除的資料列可回收,或資料表的新排序順序導致資料壓縮比率降低時,這是預期的行為。
-
在清空操作期間,查詢效能預期會受到某種程度的影響。清空操作完成後,就會恢復正常效能。
-
在清空操作期間,同時的寫入操作會繼續執行,但不建議在清空時執行寫入操作。較有效率的方式,是在執行清空之前,先完成寫入操作。此外,在清空操作開始之後寫入的任何資料,都無法藉由該次操作清空。在此情況下,將需要執行第二次清空操作。
-
若載入或插入操作已在進行中,則清空操作可能無法開始執行。清空操作會暫時需要資料表的獨佔存取權,以開始執行。需要此獨佔存取權的時間很短,因此清空操作不會長時間封鎖同時執行的載入和插入操作。
-
若沒有可對特殊資料表執行的工作,則會略過清空操作;不過,在發現可略過該操作的過程中,可能會產生一些額外成本。若您知道這是原始資料表,或未達清空閾值,則不要對它執行清空操作。
-
小型資料表上的DELETEONLY真空操作可能不會減少用於存放資料的區塊數量,特別是當資料表具有大量資料欄或叢集在每個節點使用大量切片時。這些清空操作會對每個分割的每個資料欄新增一個區塊,用來負責同時插入資料表的工作,而此額外負荷有可能超過回收磁碟空間所減少的區塊數。例如,若 8 個節點叢集上的 10 欄資料表在清空前佔用了 1000 個區塊,則清空將不會減少實際的區塊數,除非因為刪除的資料列而回收了超過 80 個區塊的磁碟空間 (每個資料區塊都使用 1 MB)。
如果符合以下任何條件,則自動清空操作會暫停:
-
使用者執行資料定義語言 (DDL) ALTER 操作,例如 TABLE,需要對目前正在進行自動吸塵的資料表進行專屬鎖定。
-
叢集中任何資料表VACUUM上的使用者觸發程序 (一次只能VACUUM執行一個)。
-
高叢集負載的期間。
範例
根據預設的 95% 清空閾值回收空間和資料庫,並排序所有資料表中的資料列。
vacuum;
根據預設的 95% 閾值來回收空間並重新排序SALES資料表中的資料列。
vacuum sales;
一律回收SALES表中的空間並重新排序資料列。
vacuum sales to 100 percent;
只有在少於 75% 的資料列已排序時,才能重新排序SALES資料表中的資料列。
vacuum sort only sales to 75 percent;
回收SALES資料表中的空間,讓至少有 75% 的剩餘資料列在真空之後不會標記為刪除。
vacuum delete only sales to 75 percent;
重新索引,然後對LISTING資料表進行吸塵。
vacuum reindex listing;
下列命令會傳回錯誤。
vacuum reindex listing to 75 percent;
叢集,然後清空LISTING資料表。
vacuum recluster listing;
叢集,然後使用 BOOST選項對LISTING資料表進行吸塵。
vacuum recluster listing boost;