

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

# 查詢執行緩慢
<a name="performance-slow-queries"></a>

## 識別 - 找出問題
<a name="identification-spot-problem"></a>

慢速執行查詢是超過您業務需求預期執行時間的查詢。構成慢查詢的定義會因不同的工作負載而有所不同。您可以透過分析器日誌或績效詳情來識別慢查詢。

1. 如果尚未啟用，請啟用分析器。Profiler 日誌會寫入日誌群組下的 Amazon CloudWatch：`/aws/docdb/<cluster-identifier>/profiler`。使用 CloudWatch Logs Insights 來查詢它們。

   取得電子商務產品集合 10 個最慢查詢的 CloudWatch 日誌分析查詢**範例**：

   ```
   filter ns="ecommerce.products" | sort millis desc | limit 10
   ```

1. 使用績效詳情近乎即時地識別昂貴的查詢。如果尚未啟用績效詳情，請將其啟用。

   1. 開啟 AWS 主控台，導覽至 Amazon Amazon DocumentDB，然後 Performance Insights，然後選取您的叢集執行個體。

   1. 檢閱資料庫載入 (AAS) 時間軸和熱門查詢 （依資料庫載入）。展開查詢摘要以檢視文字子陳述式。

   1. 擷取需要分析的查詢。
**注意**  
並非所有績效詳情中的查詢都無效或緩慢查詢。

## 調查 — 收集資訊
<a name="investigate-gather-information"></a>

1. 分析工具提供與其相關聯的查詢執行計畫和關鍵指標，包括毫秒、Nreturned 和 planSummary （索引用量）：

   ```
   {
       "op": "query",
       "ts": 1721374275673,
       "ns": "test.perf",
       "command": {
           "find": "perf",
           "filter": {
               "threadRunCount": 0
           },
           "$db": "test",
           "lsid": {
               "id": {
                   "$binary": "oO2wEtpgQIK+y9KGByYnsw==",
                   "$type": "4"
               }
           },
           "$readPreference": {
               "mode": "secondaryPreferred"
           }
       },
       "cursorExhausted": true,
       "nreturned": 0,
       "responseLength": 0,
       "protocol": "op_query",
       "millis": 137,
       "planSummary": "IXSCAN",
       "execStats": {
           "stage": "FETCH",
           "nReturned": "0",
           "executionTimeMillisEstimate": "100.346",
           "inputStage": {
               "stage": "IXSCAN",
               "nReturned": "0",
               "executionTimeMillisEstimate": "100.342",
               "indexName": "threadRunCount_1"
           }
       },
       "client": "172.31.6.165:43154",
       "appName": "ProdAppTester14",
       "user": "adminuser"
   }
   ```

   若要尋找 COLLSCAN 查詢：

   ```
   filter planSummary="COLLSCAN" | sort millis desc | limit 20
   ```

1. 使用績效詳情來即時分析查詢執行趨勢，例如等待、載入和資源影響 （例如每個查詢的 IOPS 或 CPU)。

   由於 Performance Insights 不提供查詢執行計畫，請擷取查詢，並在 Amazon DocumentDB 叢集上的查詢上執行 explain("executionStats")：

   ```
   db.ecommerce.products.find().explain("executionStats")
   ```

1. 或者，將分析器指標與績效詳情資料建立關聯 （例如，將分析器中的高毫秒查詢與績效詳情中的常用查詢進行比對）。

## 診斷 — 尋找根本原因
<a name="diagnose-find-root-cause"></a>

在此步驟中，診斷查詢計畫以識別潛在的最佳化。使用下列流程 - 症狀 → 可能原因：
+ **徵狀：** planSummary： "COLLSCAN"

  **原因：**索引遺失或不正確。
+ **徵狀：**使用 $group / $sort 緩慢彙總

  **原因：**彙總管道可能正在處理記憶體中的過多資料。
+ **徵狀：**高延遲，而績效詳情會顯示依 IO 分組的資料庫負載等待，但會使用索引 (planSummary： "IXSCAN")。

  **原因：**I/O 繫結查詢；索引或工作集超過執行個體上可用的緩衝區快取。
+ **徵狀：**PI 顯示 CPU 等待狀態，由於查詢很少，因此 AAS 很高

  **原因：**CPU 繫結查詢 （複雜彙總、$regex)。
+ **徵狀：**許多緩慢的查詢，但沒有顯示昂貴的 planSummary

  **原因：**外部瓶頸 （網路、限流、維護任務、查詢量）。

## 解決 — 修正問題
<a name="resolve-fix-issue"></a>

當您實作修正時，請務必使用 explain("executionStats") 驗證並監控 Performance Insights 資料庫負載。

1. **planSummary：「COLLSCAN」**
   + 建立目標索引。

     **範例：**針對依 { category， price } 篩選並依價格遞減排序的頻繁查詢：

     ```
     db.products.createIndex({ category: 1, price: -1 })
     ```

1. **使用 $group / $sort 緩慢彙總**
   + 提早推送 $match 和 $project，以減少流入 $group / $sort 的文件。
   + 儘早限制管道中的欄位數量：

     ```
     db.products.explain("executionStats").aggregate([
       { $match: { category: "Electronics", price: { $gt: 0 } } },   // early filter
       { $project: { price: 1, category: 1 } },                     // reduce document size
       { $group: { _id: "$category", avgPrice: { $avg: "$price" } } }
     ])
     ```

1. **高延遲，而績效詳情顯示依 IO 分組的資料庫負載等待**
   + 驗證 BufferCacheHitRatio 是否低，或執行個體上的 ReadIOPS 是否高。增加執行個體記憶體 （升級執行個體類別，例如 r6g.large → r6g.xlarge) 或使用 NVMe 執行個體類別。
   + 減少索引足跡。
   + 新增僅供讀取複本以卸載讀取流量 （如果查詢可容忍最終一致性，請使用 readPreference 設定來重新導向複本上的流量）。

1. **PI 顯示 CPU 等待狀態，由於查詢很少，因此 AAS 很高**
   + 以索引字首搜尋或 $text index 取代昂貴的 $regex。
   + 批次寫入 （插入） 以減少寫入放大。

**注意**  
在提升生產變更之前，請務必在較低的環境中測試您的變更 （非生產）。