

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

# Neptune 查詢快取可加速讀取查詢
<a name="feature-overview-lookup-cache"></a>

Amazon Neptune 會實作查詢快取，其可使用 `R5d` 執行個體的 NVMe 型 SSD，針對經常重複查詢屬性值或 RDF 常值的查詢改善讀取效能。查詢快取會暫時將這些值儲存在 NVMe SSD 磁碟區中，在這裡可以快速存取它們。

如果需要從叢集儲存磁碟區而非記憶體擷取屬性值或常值，則傳回大量頂點和邊緣或許多 RDF 三元組之屬性的讀取查詢可能會有較高的延遲。範例包括長時間執行的讀取查詢，這些查詢會從身分圖傳回大量完整名稱，或從詐騙偵測圖傳回 IP 地址。隨著查詢傳回的屬性值或 RDF 常值數量增加，可用記憶體會減少，而且您的查詢執行效能可能會大幅降低。

# Neptune 查詢快取的使用案例
<a name="feature-overview-lookup-cache-when-to-use"></a>

查詢快取僅在您的讀取查詢傳回非常大量頂點和邊緣或 RDF 三元組的屬性時才有幫助。

為了最佳化查詢效能，Amazon Neptune 會使用 `R5d` 執行個體類型，為這類屬性值或常值建立大型快取。然後，從快取擷取它們會比從叢集儲存磁碟區擷取它們快得多。

根據經驗法則，只有在滿足下列三個條件的情況下，才能啟用查詢快取：
+ 您一直觀察到讀取查詢中的延遲增加。
+ 您還觀察到 `BufferCacheHitRatio` [CloudWatch 指標](cw-metrics.md#cw-metrics-available)在執行讀取查詢時下降 (請參閱 [使用 Amazon CloudWatch 監控 Neptune](cloudwatch.md))。
+ 在呈現結果之前，您的讀取查詢會花費大量時間實體化傳回值 (請參閱下面的 Gremlin-profile 範例，取得確定要針對一個查詢具體化多少屬性值的方法)。

**注意**  
此功能「僅」**在上述特定案例中有幫助。例如，查詢快取根本無法幫助彙總查詢。除非您正在執行將從查詢快取得益的查詢，否則沒有理由使用 `R5d` 執行個體類型，而非同等且費用較低的 `R5` 執行個體類型。

如果您使用的是 Gremlin，您可以使用 [Gremlin `profile` API](gremlin-profile-api.md) 評估查詢的具體化成本。在「索引操作」下，它會顯示執行期間具體化的術語數量：

```
Index Operations
Query execution:
    # of statement index ops: 3
    # of unique statement index ops: 3
    Duplication ratio: 1.0
    # of terms materialized: 5273
Serialization:
    # of statement index ops: 200
    # of unique statement index ops: 140
    Duplication ratio: 1.43
    # of terms materialized: 32693
```

具體化的非數字術語數量直接與 Neptune 必須執行的術語查詢數量成正比。

# 使用查詢快取
<a name="feature-overview-lookup-cache-using"></a>

查詢快取僅適用於 `R5d` 執行個體類型，預設會自動將其啟用。Neptune `R5d` 執行個體具有與 `R5` 執行個體相同的規格，加上高達 1.8 TB 的本機 NVMe 型 SSD 儲存體。查詢快取是執行個體特定的，且受益的工作負載可以專門導向至 Neptune 叢集中的 `R5d` 執行個體，而其他工作負載則可以導向至 `R5` 或其他執行個體類型。

若要在 Neptune 執行個體上使用查詢快取，只要將該執行個體升級至 `R5d` 執行個體類型即可。當您這麼做時，Neptune 會自動將資料庫叢集參數設定為 [neptune\$1lookup\$1cache](parameters.md#parameters-db-cluster-parameters-neptune_lookup_cache) `1`（已啟用），並在該特定執行個體上建立查詢快取。然後，您可以使用 [執行個體狀態](access-graph-status.md) API 來確認快取已啟用。

同樣地，若要在給定執行個體上停用查詢快取，請將執行個體從 `R5d` 執行個體類型縮減至相等的 `R5` 執行個體類型。

啟動 `R5d` 執行個體時，會啟用查詢快取且其處於冷啟動模式中，表示它是空白的。處理查詢時，Neptune 首先會在查詢快取中檢查是否有屬性值或 RDF 常值，並新增它們 (如果尚未存在的話)。這會逐漸預熱快取。

當您將需要屬性值或 RDF 常值查詢的讀取查詢導向至 R5d「讀取器」**執行個體時，讀取效能會在其快取預熱時稍微降低。不過，當快取預熱時，讀取效能會大幅加快，而且您也可能會看到與命中快取而非叢集儲存體的查詢相關的 I/O 成本下降。記憶體使用率也會改善。

如果您的「寫入器」**執行個體是 `R5d`，則它會在每次寫入操作時自動預熱其查詢快取。此方法確實會稍微增加寫入查詢的延遲，但會更有效率地預熱查詢快取。然後，如果將需要屬性值或 RDF 常值查詢的讀取查詢導向至寫入器執行個體，則您會立即開始獲得改善的讀取效能，因為已在該處快取這些值。

此外，如果您在 `R5d` 寫入器執行個體上執行大量載入器，則可能會注意到其效能由於快取而略為降低。

因為查詢快取是每個節點特定的，所以主機更換會將快取重設為冷啟動。

您可以將資料庫叢集參數設定為 `0`（停用）[neptune\$1lookup\$1cache](parameters.md#parameters-db-cluster-parameters-neptune_lookup_cache)，暫時停用資料庫叢集中所有執行個體的查詢快取。不過，一般而言，在特定執行個體上停用快取會更有意義，方法是將它們從 `R5d` 縮減至 `R5` 執行個體類型。