

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

# 管理索引
<a name="working.manage-indexes"></a>

**重要**  
支援終止通知：現有客戶將可以使用 Amazon QLDB，直到 07/31/2025 的支援結束為止。如需詳細資訊，請參閱[將 Amazon QLDB Ledger 遷移至 Amazon Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

本節說明如何在 Amazon QLDB 中建立、描述和捨棄索引。您可以在 中定義每個資料表的索引數量配額[Amazon QLDB 中的配額和限制](limits.md#limits.fixed)。

**Topics**
+ [

## 建立索引
](#working.manage-indexes.create)
+ [

## 描述索引
](#working.manage-indexes.describe)
+ [

## 捨棄索引
](#working.manage-indexes.drop)
+ [

## 常見錯誤
](#working.manage-indexes.errors)

## 建立索引
<a name="working.manage-indexes.create"></a>

如 中所述[建立資料表和索引](working.create.md#working.create.tables-indexes)，您可以使用 [CREATE INDEX](ql-reference.create-index.md) 陳述式，在指定最上層欄位的資料表上建立索引，如下所示。資料表名稱和索引欄位名稱都區分大小寫。

```
CREATE INDEX ON VehicleRegistration (VIN)
```

```
CREATE INDEX ON VehicleRegistration (LicensePlateNumber)
```

您在資料表上建立的每個索引都有系統指派的唯一 ID。若要尋找此索引 ID，請參閱以下章節 [描述索引](#working.manage-indexes.describe)。

**重要**  
QLDB 需要索引才能有效率地查詢文件。如果沒有索引，QLDB 讀取文件時需要執行完整資料表掃描。這可能會導致大型資料表的效能問題，包括並行衝突和交易逾時。  
若要避免資料表掃描，您必須在索引欄位或文件 ID 上使用*等式*運算子 (`=` 或 `IN`) 搭配`WHERE`述詞子句執行陳述式。如需詳細資訊，請參閱[最佳化查詢效能](working.optimize.md)。

建立索引時請注意下列限制：
+ 索引只能在單一最上層欄位上建立。不支援複合、巢狀、唯一和以函數為基礎的索引。
+ 您可以在任何 [Ion 資料類型](ql-reference.data-types.md)上建立索引，包括 `list`和 `struct`。不過，無論 Ion 類型為何，您都只能依整個 Ion 值的相等性執行索引查詢。例如，使用 `list` 類型做為索引時，您無法透過清單中的一個項目進行索引查詢。
+ 只有在您使用等式述詞時，查詢效能才會獲得改善；例如， `WHERE indexedField = 123`或 `WHERE indexedField IN (456, 789)`。

  QLDB 不會遵守查詢述詞中的不等式。因此，不會實作範圍篩選掃描。
+ 索引欄位的名稱區分大小寫，最多可有 128 個字元。
+ QLDB 中的索引建立是非同步的。在非空白資料表上完成建立索引所需的時間，會因資料表大小而有所不同。如需詳細資訊，請參閱[管理索引](#working.manage-indexes)。

## 描述索引
<a name="working.manage-indexes.describe"></a>

QLDB 中的索引建立是非同步的。在非空白資料表上完成建立索引所需的時間，會因資料表大小而有所不同。若要檢查索引組建的狀態，您可以查詢系統目錄資料表 [information\$1schema.user\$1tables](working.catalog.md)。

例如，下列陳述式會查詢 `VehicleRegistration` 資料表上所有索引的系統目錄。

```
SELECT VALUE indexes
FROM information_schema.user_tables info, info.indexes indexes
WHERE info.name = 'VehicleRegistration'
```

```
{
    indexId: "Djg2nt0yIs2GY0T29Kud1z",
    expr: "[VIN]",
    status: "ONLINE"
},
{
    indexId: "4tPW3fUhaVhDinRgKRLhGU",
    expr: "[LicensePlateNumber]",
    status: "FAILED",
    message: "aws.ledger.errors.InvalidEntityError: Document contains multiple values for indexed field: LicensePlateNumber"
}
```

**索引欄位**
+ `indexId` – 索引的唯一 ID。
+ `expr` – 索引文件路徑。此欄位是格式為： 的字串`[fieldName]`。
+ `status` – 索引的目前狀態。索引的狀態可以是下列其中一個值：
  + `BUILDING` – 正在積極建立資料表的索引。
  + `FINALIZING` – 已完成建立索引，並開始啟用索引以供使用。
  + `ONLINE` – 處於作用中狀態，並準備好在查詢中使用。在狀態為上線之前，QLDB 不會在查詢中使用索引。
  + `FAILED` – 由於無法復原的錯誤而無法建置索引。此狀態的索引仍會計入每個資料表的索引配額。如需詳細資訊，請參閱[常見錯誤](#working.manage-indexes.errors)。
  + `DELETING` – 使用者捨棄索引後，正在主動刪除索引。
+ `message` – 描述索引具有`FAILED`狀態之原因的錯誤訊息。只有失敗的索引才包含此欄位。

### 使用主控台
<a name="working.manage-indexes.describe.con"></a>

您也可以使用 AWS 管理主控台 來檢查索引的狀態。

**檢查索引的狀態 （主控台）**

1. 登入 AWS 管理主控台，並在 [https://console.aws.amazon.com/qldb](https://console.aws.amazon.com/qldb)：// 開啟 Amazon QLDB 主控台。

1. 在導覽窗格中，選擇 **Ledgers**。

1. 在 **Ledgers** 清單中，選擇您要管理其索引的分類帳名稱。

1. 在分類帳詳細資訊頁面的**資料表**索引標籤下，選擇您要檢查其索引的資料表名稱。

1. 在資料表詳細資訊頁面上，找到**索引欄位**卡。**索引狀態**欄會顯示資料表上每個索引的目前狀態。

## 捨棄索引
<a name="working.manage-indexes.drop"></a>

使用 [DROP INDEX](ql-reference.drop-index.md)陳述式來捨棄索引。當您捨棄索引時，它會從資料表中永久刪除。

首先，從 尋找索引 ID`information_schema.user_tables`。例如，下列查詢會傳回`VehicleRegistration`資料表上索引`LicensePlateNumber`欄位`indexId`的 。

```
SELECT indexes.indexId
FROM information_schema.user_tables info, info.indexes indexes
WHERE info.name = 'VehicleRegistration' and indexes.expr = '[LicensePlateNumber]'
```

然後，使用此 ID 來捨棄索引。以下是捨棄索引 ID 的範例`4tPW3fUhaVhDinRgKRLhGU`。索引 ID 是應該以雙引號括住的唯一識別符。

```
DROP INDEX "4tPW3fUhaVhDinRgKRLhGU" ON VehicleRegistration WITH (purge = true)
```

**注意**  
所有`DROP INDEX`陳述式`WITH (purge = true)`都需要 子句，目前`true`唯一支援的值。  
關鍵字區分`purge`大小寫，且必須是所有小寫。

### 使用主控台
<a name="working.manage-indexes.drop.con"></a>

您也可以使用 AWS 管理主控台 來捨棄索引。

**捨棄索引 （主控台）**

1. 登入 AWS 管理主控台，並在 [https://console.aws.amazon.com/qldb](https://console.aws.amazon.com/qldb)：// 開啟 Amazon QLDB 主控台。

1. 在導覽窗格中，選擇 **Ledgers**。

1. 在 **Ledgers** 清單中，選擇您要管理其索引的分類帳名稱。

1. 在分類帳詳細資訊頁面的**資料表**索引標籤下，選擇您要捨棄其索引的資料表名稱。

1. 在資料表詳細資訊頁面上，找到**索引欄位**卡。選取您要捨棄的索引，然後選擇**捨棄索引**。

## 常見錯誤
<a name="working.manage-indexes.errors"></a>

本節說明您在建立索引時可能遇到的常見錯誤，並建議可能的解決方案。

**注意**  
狀態為 的索引`FAILED`仍會計入每個資料表的索引配額。失敗的索引也可讓您修改或刪除導致資料表上索引建立失敗的任何文件。  
您必須明確[捨棄](#working.manage-indexes.drop)索引，才能將其從配額中移除。

**文件包含索引欄位的多個值：*fieldName*。**  
QLDB 無法為指定的欄位名稱建立索引，因為資料表包含具有相同欄位多個值 （即重複欄位名稱） 的文件。  
您必須先捨棄失敗的索引。然後，請確定資料表中的所有文件在重試建立索引之前，每個欄位名稱都只有一個值。您也可以為沒有重複的另一個欄位建立索引。  
如果您嘗試為已在資料表上編製索引的欄位插入包含多個值的文件，QLDB 也會傳回此錯誤。

**超過索引限制：Table *tableName* 已有 *n* 個索引，且無法建立更多索引。**  
QLDB 會強制執行每個資料表的五個索引限制，包括失敗的索引。您必須先捨棄現有的索引，才能建立新的索引。

**沒有具有識別符的已定義索引：*indexId*。**  
您嘗試捨棄的索引不存在於指定的資料表和索引 ID 組合。若要了解如何檢查現有的索引，請參閱 [描述索引](#working.manage-indexes.describe)。