

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# VACUUM
<a name="r_VACUUM_command"></a>

在指定的資料表中或目前資料庫的所有資料表中，重新排序資料列並回收空間。

**注意**  
只有具有必要資料表權限的使用者才能有效地清除資料表。若 VACUUM 執行時沒有必要的資料表權限，操作仍會成功完成，但不會有任何作用。如需有效執行 VACUUM 的有效資料表權限清單，請參閱下列「所需權限」一節。

Amazon Redshift 會自動排序資料並在背景中執行 VACUUM DELETE。這可以減少執行 VACUUM 命令的需求。如需詳細資訊，請參閱[清空資料表](t_Reclaiming_storage_space202.md)。

根據預設，若資料表中超過 95% 的資料列已排序，則 VACUUM 會略過資料表的排序階段。略過排序階段可大幅改善 VACUUM 的效能。若要變更單一資料表預設的排序或刪除閾值，則在執行 VACUUM 命令時，包含資料表名稱和 TO *threshold* PERCENT 參數。

使用者可以在清空資料表時加以存取。在清空資料表時您可以執行查詢和寫入操作，但是當資料處理語言 (DML) 命令和清空並行執行時，這兩項可能都需要較長時間。如果您在清空期間執行 UPDATE 和 DELETE 陳述式，系統效能可能會降低。VACUUM DELETE 展示封鎖更新和刪除操作。

Amazon Redshift 會在背景自動執行 DELETE ONLY 清空。使用者執行資料定義語言 (DDL) 操作 (例如 ALTER TABLE) 時，自動清空操作將暫停。

**注意**  
Amazon Redshift VACUUM 命令語法和行為與 PostgreSQL VACUUM 操作有著顯著的差異。例如，Amazon Redshift 中的預設 VACUUM 操作為 VACUUM FULL，其會回收磁碟空間並重新排序所有資料列。相反地，PostgreSQL 中的預設 VACUUM 操作只會回收空間，並將空間提供重複使用。

如需詳細資訊，請參閱[清空資料表](t_Reclaiming_storage_space202.md)。

## 所需權限
<a name="r_VACUUM_command-privileges"></a>

以下是 VACUUM 所需的權限：
+ 超級使用者
+ 具有 VACUUM 權限的使用者
+ 資料表擁有者
+ 共用資料表的資料庫擁有者

## 語法
<a name="r_VACUUM_command-synopsis"></a>

```
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ]
[ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
```

## Parameters
<a name="r_VACUUM_command-parameters"></a>

FULL   <a name="vacuum-full"></a>
排序指定的資料表 (或目前資料庫中的所有資料表)，並回收先前 UPDATE 和 DELETE 操作將其標記為要進行刪除的資料列所佔用的磁碟空間。VACUUM FULL 是預設值。  
完整清空並不會對交錯資料表執行重新建立索引。若要在完整清空之後重新建立交錯資料表的索引，請使用 [VACUUM REINDEX](#vacuum-reindex) 選項。  
根據預設，若資料表中至少有 95% 的資料列已排序，則 VACUUM FULL 會略過資料表的排序階段。若 VACUUM 能夠略過排序階段，它就會執行 DELETE ONLY，並且在刪除階段中回收空間，如此至少有 95% 的剩餘資料列不會標記為要進行刪除。   
若未達排序閾值 (例如 90% 的資料列已排序)，且 VACUUM 執行了完整排序，則也會執行完整刪除操作，並復原已刪除資料列的全部空間。  
您只能變更單一資料表的預設清空閾值。若要變更單一資料表預設的清空閾值，請包含資料表名稱和 TO *threshold* PERCENT 參數。

SORT ONLY   <a name="vacuum-sort-only"></a>
排序指定的資料表 (或目前資料庫中的所有資料表)，但不回收已刪除資料列釋出的空間。當回收磁碟空間不重要，但重新排序新資料列很重要時，此選項很實用。若未排序的區域未包含大量已刪除資料列，且未跨到整個已排序區域，則 SORT ONLY 清空可縮短清空操作的經過時間。若應用程式沒有磁碟空間限制條件，但須倚賴與保持資料表資料列排序狀態相關聯的查詢最佳化，則可受益於這類清空。  
根據預設，若資料表中至少有 95% 的內容已排序，則 VACUUM SORT ONLY 會略過資料表。若要變更單一資料表預設的排序閾值，則在執行 VACUUM 時，包含資料表名稱和 TO *threshold* PERCENT 參數。

DELETE ONLY   <a name="vacuum-delete-only"></a>
Amazon Redshift 僅在背景執行 DELETE ONLY 清空，因此您很少需要執行 DELETE ONLY 清空。  
回收先前 UPDATE 和 DELETE 操作將其標記為要進行刪除的資料列所佔用的 VACUUM DELETE 磁碟空間，並使資料表精簡以釋出耗用的空間。DELETE ONLY 清空操作不會排序資料表的資料。  
當回收磁碟空間很重要，但重新排序新資料列不重要時，此選項可縮短清空操作的經過時間。當您的查詢效能已達最佳狀態，而不需要重新排序資料列來最佳化查詢效能時，此選項也很實用。  
根據預設，VACUUM DELETE ONLY 回收空間，如此至少有 95% 的剩餘資料列不會標記為要進行刪除。若要變更單一資料表預設的刪除閾值，則在執行 VACUUM 時，包含資料表名稱和 TO *threshold* PERCENT 參數。    
某些操作 (如 `ALTER TABLE APPEND`) 可能造成資料表遭切割成片段。當您使用 `DELETE ONLY` 子句時，清空操作會回收片段資料表的空間。重組操作同樣會套用 95% 的閾值。

REINDEX  <a name="vacuum-reindex"></a>
分析交錯排序索引鍵資料欄中值的分佈，然後執行完整的 VACUUM 操作。若使用了 REINDEX，則需有資料表名稱。  
VACUUM REINDEX 所需的時間會比 VACUUM FULL 大幅增加，因為它會額外進行交錯排序索引鍵分析。交錯資料表的排序和合併操作可能需要更長的時間，因為交錯排序可能需要重新排列比複合排序更多的資料列。  
如果 VACUUM REINDEX 操作在完成之前終止，下一次 VACUUM 在執行完整清空操作之前，會繼續執行重建索引操作。  
TO *threshold* PERCENT 不支援 VACUUM REINDEX。  

RECLUSTER  <a name="vacuum-recluster"></a>
排序資料表中未排序的部分。已依自動資料表排序排序的資料表部分會保持不變。此命令不會將新排序的資料與已排序的區域合併。也不會回收標記為刪除的所有空間。完成此命令後，資料表可能不會顯示完全排序，如 SVV\_TABLE\_INFO 中的 `unsorted` 欄位所指示。  
 我們建議您針對頻繁擷取的大型資料表以及僅存取最新資料的查詢，使用 VACUUM RECLUSTER。  
 TO threshold PERCENT 不支援 VACUUM RECLUSTER。若使用了 RECLUSTER，則需有資料表名稱。  
在具有交錯排序索引鍵的資料表和具有 ALL 分佈樣式的資料表上，不支援 VACUUM RECLUSTER。

 *table\_name*   
要清空的資料表名稱。如果您未指定資料表名稱，則清空操作會套用至目前資料庫中的所有資料表。您可以指定任何使用者建立的永久或臨時資料表。此命令對於其他物件並無意義，例如檢視和系統資料表。  
 若您包含 TO *threshold* PERCENT 參數，則需有資料表名稱。

 TO *threshold* PERCENT   
此子句會指定閾值，超過此值時，VACUUM 會略過排序階段，以及指定在刪除階段中回收空間的目標閾值。*排序閾值*是清空之前，指定資料列中已依照排序順序排列的總列數百分比。 *刪除閾值*是清空之後，未標記為要進行刪除的總列數百分比下限。  
由於 VACUUM 只會在資料表中已排序資料列的百分比低於排序閾值時重新排序資料列，因此 Amazon Redshift 通常可大幅縮短 VACUUM 的時間。同樣地，當 VACUUM 未限於回收全部標記為要刪除之資料列的空間時，它經常能夠略過重新寫入只包含少數已刪除資料列的區塊。  
例如，若您指定 75 做為*閾值*，VACUUM 就會在資料表中有 75% 以上的資料列已依照排序順序排列時，略過排序階段。若是刪除階段，VACUUMS 會設定回收磁碟空間的目標，如此在清空之後，資料表中至少有 75% 的資料列不會標記為要進行刪除。*閾值*必須是介於 0 到 100 之間的整數。預設為 95。若您指定的值是 100，則除非資料表已完整排序，否則 VACUUM 一律會排序資料表，並且回收所有標記為要進行刪除之資料列的空間。若您指定的值是 0，則 VACUUM 永遠不會排序資料表，也不會回收空間。  
若您包含 TO *threshold* PERCENT 參數，則也必須指定資料表名稱。若省略資料表名稱，則 VACUUM 會失敗。  
您無法使用 TO *threshold* PERCENT 參數與 REINDEX 搭配。

BOOST  
搭配其他資源 (例如記憶體和磁碟空間) 執行 VACUUM 命令 (可用時)。使用 BOOST 選項，VACUUM 會在一個視窗中運作，並在 VACUUM 操作的期間封鎖同時進行的刪除和更新。搭配 BOOST 選項執行會和系統資源發生競爭，可能影響查詢效能。請在系統負荷較輕時執行 VACUUM BOOST，例如維護操作期間。  
請在使用 BOOST 選項時考慮以下事項：  
+ 指定 BOOST 時，*table\_name* 值為必要項目。
+ 不支援與 REINDEX 同時使用 BOOST。
+ 使用 DELETE ONLY 時會忽略 BOOST。

## 使用須知
<a name="r_VACUUM_usage_notes"></a>

對於大多數 Amazon Redshift 應用程式，建議您執行完整清空。如需詳細資訊，請參閱[清空資料表](t_Reclaiming_storage_space202.md)。

在執行清空操作之前，請注意以下行為：
+ 您無法執行 VACUUM 於交易區塊內 (BEGIN ... END)。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。
+ 當資料庫清空時，資料庫可能會稍微擴大。在沒有刪除的資料列可回收，或資料表的新排序順序導致資料壓縮比率降低時，這是預期的行為。
+ 在清空操作期間，查詢效能預期會受到某種程度的影響。清空操作完成後，就會恢復正常效能。
+ 在清空操作期間，同時的寫入操作會繼續執行，但不建議在清空時執行寫入操作。較有效率的方式，是在執行清空之前，先完成寫入操作。此外，在清空操作開始之後寫入的任何資料，都無法藉由該次操作清空。在此情況下，將需要執行第二次清空操作。
+ 若載入或插入操作已在進行中，則清空操作可能無法開始執行。清空操作會暫時需要資料表的獨佔存取權，以開始執行。需要此獨佔存取權的時間很短，因此清空操作不會長時間封鎖同時執行的載入和插入操作。
+ 若沒有可對特殊資料表執行的工作，則會略過清空操作；不過，在發現可略過該操作的過程中，可能會產生一些額外成本。若您知道這是原始資料表，或未達清空閾值，則不要對它執行清空操作。
+ 在小型資料表上執行 DELETE ONLY 清空操作可能不會減少用來儲存資料的區塊數目，尤其是在資料表有大量資料欄，或叢集在每個節點上使用大量分割時。這些清空操作會對每個分割的每個資料欄新增一個區塊，用來負責同時插入資料表的工作，而此額外負荷有可能超過回收磁碟空間所減少的區塊數。例如，若 8 個節點叢集上的 10 欄資料表在清空前佔用了 1000 個區塊，則清空將不會減少實際的區塊數，除非因為刪除的資料列而回收了超過 80 個區塊的磁碟空間 (每個資料區塊都使用 1 MB)。

如果符合以下任何條件，則自動清空操作會暫停：
+ 使用者執行資料定義語言 (DDL) 操作，例如 ALTER TABLE，其需要在自動清空目前作業所在的資料表上進行獨佔鎖定。
+ 高叢集負載的期間。

### 支援並行 VACUUM
<a name="r_VACUUM_usage_notes_concurrent"></a>

Amazon Redshift 支援在叢集或工作群組中的不同工作階段中，並行執行多個清空交易。這表示，您可以一次發出所有清空模式的多個不同執行個體，且每個清空交易都在唯一的資料表上。單一資料表上無法同時值行兩項清空操作。

**執行並行清空的指引**
+ 在不同工作階段中執行並行清空交易時，您應該監控系統資源，並避免並行執行太多清空操作。
+ 建議的並行層級取決於要回收的空間量、要排序的列數和列寬、倉儲的大小，以及與 VACUUM 操作一起執行的工作負載大小。
+ 根據清空交易的模式，從兩個並行清空操作開始，並根據其執行時間和系統負載加入更多。就像使用者發出的其他繁重查詢一樣，如果您在 Amazon Redshift 達到系統資源限制時同時執行太多操作，則清空操作可能會開始排入佇列。
+ 執行多個 Vacuum BOOST 操作時務必謹慎。搭配 BOOST 選項執行 Vacuum 會和系統資源發生競爭，可能影響查詢效能。請在系統負荷較輕時執行 VACUUM BOOST，例如維護操作期間。
+ 如果您未指定資料表名稱，則清空操作會套用至目前資料庫中的所有資料表。這些清空操作仍會循序執行。

## 範例
<a name="r_VACUUM_command-examples"></a>

根據預設的 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;
```