

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

# ALTER TABLE ADD PARTITION
<a name="alter-table-add-partition"></a>

為資料表建立一或多個分割區欄。每個分割區由一或多個不同的欄名稱/值組合組成。每種指定的組合都會另外建立一個資料目錄，這樣可在某些情況下改善查詢效能。分割區的欄本身不存在於資料表的資料中，因此，如果您使用的分割區欄名稱和資料表中的欄名稱相同，就會發生錯誤。如需詳細資訊，請參閱[分割您的資料](partitions.md)。

在 Athena 中，資料表及其分割區必須使用相同的資料格式，但其結構描述可能不同。如需詳細資訊，請參閱[更新含有分割區的資料表](updates-and-partitions.md)。

如需有關 IAM 政策中所需資源層級許可的資訊 (包括 `glue:CreatePartition`)，請參閱《[AWS Glue API 許可：動作和資源參考](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)》以及 [在 中設定資料庫和資料表的存取權 AWS Glue Data Catalog](fine-grained-access-to-glue-resources.md)。如需有關使用 Athena 時許可的疑難排解資訊，請參閱 [對 Athena 中的問題進行疑難排解](troubleshooting-athena.md) 主題的 [許可](troubleshooting-athena.md#troubleshooting-athena-permissions) 章節。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION
  (partition_col1_name = partition_col1_value
  [,partition_col2_name = partition_col2_value]
  [,...])
  [LOCATION 'location1']
  [PARTITION
  (partition_colA_name = partition_colA_value
  [,partition_colB_name = partition_colB_value
  [,...])]
  [LOCATION 'location2']
  [,...]
```

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

當新增分割區時，您可以為分割區指定一或多個資料欄名稱/值組，以及該分割區的資料檔案所在的 Simple Storage Service (Amazon S3) 路徑。

**[IF NOT EXISTS]**  
如果已有相同定義的分割區，則會造成錯誤隱藏。

**PARTITION (partition\_col\_name = partition\_col\_value [,...])**  
使用您指定的資料欄名稱/值組合來建立分割區。只有當欄的資料類型是字串時，才需要以字串字元圍住 `partition_col_value`。

**[LOCATION 'location']**  
指定目錄，將在其中存放先前陳述式定義的分割區。當資料使用 Hive 樣式分割 (`pk1=v1/pk2=v2/pk3=v3`) 時，`LOCATION` 子句為選用的。使用 Hive 樣式分割時，會從資料表的位置、分割區索引鍵名稱和分割區索引鍵值自動建構完整的 Amazon S3 URI。如需詳細資訊，請參閱[分割您的資料](partitions.md)。

## 考量事項
<a name="alter-table-add-partition-considerations"></a>

對您可以在單一 `ALTER TABLE ADD PARTITION` DDL 陳述式中新增的分割區數量，Amazon Athena 不會施加特定限制。不過，如果您需要新增大量分割區，請考慮將操作分成較小的批次，以避免潛在的效能問題。下列範例使用連續命令來個別新增分割區，並使用 `IF NOT EXISTS` 來避免新增重複項目。

```
ALTER TABLE {{table_name}} ADD IF NOT EXISTS PARTITION (ds='2023-01-01')
ALTER TABLE {{table_name}} ADD IF NOT EXISTS PARTITION (ds='2023-01-02')
ALTER TABLE {{table_name}} ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
```

 在 Athena 中使用分割區時，也請謹記以下幾點：
+ 雖然 Athena 支援查詢具有 1，000 萬個分割區的 AWS Glue 資料表，但 Athena 無法在單一掃描中讀取超過 100 萬個分割區。
+ 若要最佳化查詢並減少掃描的分割區數量，請考慮分割區剔除或使用分割區索引等策略。

如需有關在 Athena 中使用分割區的其他考量事項，請參閱 [分割您的資料](partitions.md)。

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

下列範例會將單一分割區新增至資料表，以取得 HIVE 樣式分割資料。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-14', country = 'IN');
```

下列範例會將多個分割區新增至資料表，以取得 HIVE 樣式分割資料。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN')
  PARTITION (dt = '2016-06-01', country = 'IN');
```

如果資料表不適用於 HIVE 樣式的分割資料，則 `LOCATION` 子句是必需的，且應該是包含分割區資料之字首的完整 Amazon S3 URI。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_31_May_2016/'
  PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_01_June_2016/';
```

若要在分割區已存在時忽略錯誤，請使用 `IF NOT EXISTS` 子句，如下列範例所示。

```
ALTER TABLE orders ADD IF NOT EXISTS
  PARTITION (dt = '2016-05-14', country = 'IN');
```

## 零位元組 `_$folder$` 檔案
<a name="alter-table-add-partition-zero-byte-folder-files"></a>

如果您執行 `ALTER TABLE ADD PARTITION` 語句並錯誤地指定已存在的分區和不正確的 Simple Storage Service (Amazon S3) 位置，則格式為 `{{partition_value}}_$folder$` 的零位元組預留位置檔案會在 Simple Storage Service (Amazon S3) 中建立。您必須手動移除這些檔案。

若要防止這種情況發生，請使用 `ALTER TABLE ADD PARTITION` 陳述式中的 `ADD IF NOT EXISTS` 語法，如下列範例所示。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]
```