跳至內容

為什麼我的 Amazon DocumentDB 叢集中會有執行緩慢的查詢?

1 分的閱讀內容
0

我想要疑難排解 Amazon DocumentDB (with MongoDB compatibility) 叢集中執行緩慢的查詢,以改善效能。

解決方法

由於以下原因,您在 Amazon DocumentDB 叢集中可能會遇到查詢執行緩慢的情況:

  • 硬體規格不足
  • 工作負載變更
  • 流量增加
  • 記憶體問題
  • 查詢計畫未最佳化

監控您的工作負載

若要了解資料庫效能問題的根本原因,請檢查您的執行個體所使用的所有全伺服器資源。監控您的工作負載,並調查查詢效能在何時處於最佳狀態,以及查詢從何時開始需要很長時間才能執行。

使用 Amazon CloudWatch 指標

使用適用於 Amazon DocumentDB 的 CloudWatch 指標來分析您的叢集效能。若要找出因資源不足而造成的效能瓶頸,請使用 CPUUtilizationFreeableMemory 等指標。若要了解記憶體最佳化情況,請使用 BufferCacheHitRatioLowMemNumOperationsThrottled 等指標。

監控作業層級指標,以了解您執行個體上的工作負載。實用的指標包括 DocumentsInsertedDocumentsReturnedDocumentsDeletedTransactionsAborted。如需更多資訊,請參閱監控 Amazon DocumentDB (with MongoDB compatibility) 叢集的指標並設定警示

使用 Performance Insights

使用 Performance Insights,依等待、查詢、主機、資料庫和應用程式等面向來評估您的資料庫工作負載。擷取計數器詳細查詢資訊,並評估哪些查詢對資料庫負載的貢獻最大。高於 Max vCPU 值的資料庫負載表示執行個體類別上的工作負載已受到限流。分析查詢文字,以協助您調整查詢。

使用 Profiler 日誌

使用 Amazon DocumentDB Profiler 來記錄在叢集上執行之作業的執行時間和詳細資訊。Profiler 可讓您監控叢集上最慢的作業。這有助於您改善個別查詢效能和整體叢集效能。

使用資料庫方法

定期在您的 Amazon DocumentDB 執行個體上執行以下 currentOp() 命令,以監控一段時間內的系統使用情況:

db.adminCommand({currentOp: 1, $all: 1});

若要計算系統中每個命名空間內的查詢和作業數量,請執行以下命令:

db.adminCommand({
  aggregate: 1,
  pipeline: [
    {
      $currentOp: {
        allUsers: true,
        idleConnections: true
      }
    },
    {
      $group: {
        _id: {
          desc: "$desc",
          ns: "$ns",
          WaitState: "$WaitState"
        },
        count: {
          $sum: 1
        }
      }
    }
  ],
  cursor: {}
});

執行命令後,請分析系統使用結果,以了解系統上的負載並採取適當動作。

最佳化您的查詢

找出長時間執行的查詢後,請調整查詢以改善查詢效能。

使用正確的查詢規劃器

若要改善效能,請使用最佳索引計畫,並為您的運算子啟用索引掃描支援。對於 Amazon DocumentDB 5.0 版及更新版本,請使用規劃器版本 2.0,以利用進階查詢規劃器來最佳化 find、update、delete 和 find-and-modify 命令等基礎作業。對於未選取最佳索引的特定查詢模式,此功能會新增對計畫快取篩選條件功能的支援,讓您能夠為特定查詢形狀指定索引清單。

分析查詢的統計資料

若要最佳化查詢效能,請使用 executionStats 來分析查詢的執行方式。executionStats 會提供每個查詢階段處理的文件數、每個階段的執行時間,以及產生查詢計畫時進行的嘗試次數。

若要查看查詢的統計資料,請執行以下命令:

query.explain("executionStats");

範例作業:

db.collection.find({}).limit(2).explain("executionStats");

上述範例作業會分析當您嘗試尋找兩份文件時,查詢的執行情況。

檢閱傳回的統計資料。您可以新增索引以減少完整集合掃描,並限制查詢必須掃描的文件數量。最佳實務是測試任何新索引並評估效能。使用複製快照還原選項來建立測試環境。

檢查執行個體中是否存在低效率索引

每個索引都會在您的資源上增加額外的寫入延遲、CPU 使用量、I/O 作業,以及整體已使用的儲存空間。雖然索引可以改善查詢效能,但最佳實務是定期檢閱索引並移除未使用的索引。

若要查看每個索引的存取頻率明細,請執行與以下範例類似的命令:

db.collection.aggregate([{$indexStats:{}}]).pretty()

若要查看使用索引執行的掃描 (索引掃描) 總數,請執行以下命令:

db.collection.stats()

將前述查詢的計數與未使用索引執行的掃描數量 (集合掃描) 進行比較。然後分析作業在存取集合時使用索引的頻率。

關閉執行個體上的非使用中游標

Amazon DocumentDB 執行個體對特定時間可開啟的作用中游標數量設有限制。您使用的執行個體類型會決定此限制。如需更多資訊,請參閱執行個體限制。使用 CloudWatch 監控 CloudWatch 中的 DatabaseCursors 指標,以檢閱已開啟游標的數量。

若要查看開啟游標的更多詳細資訊,請執行與以下範例類似的命令:

db.runCommand("listCursors")

最佳實務是在使用完游標後關閉游標,可避免限流。閒置游標會使用 CPU 和記憶體來監控與其相關聯的佇列。

相關資訊

疑難排解效能和資源使用率

AWS 官方已更新 6 個月前