

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 長時間実行されるクエリ
<a name="anti-pattern-long-running-queries"></a>

## 概要
<a name="long-queries-overview"></a>

長時間実行されるクエリは、クラスター全体のパフォーマンス問題にカスケードされる可能性があります。これらのクエリは、Amazon DocumentDB の Multi-Version Concurrency Control (MVCC) ガベージコレクションプロセスに干渉し、古いバージョニングされたドキュメントが蓄積され、クラスター全体のパフォーマンスが低下する可能性があります。Amazon DocumentDB は、ランナウェイクエリがリソースを無期限に消費することを制限する安全メカニズムとして、2 時間のサーバー側のタイムアウトを実装します。

**長時間実行されるクエリとは:**
+ 長期間 (通常は > 30 分) 実行されるクエリ
+ 数時間アクティブのままのオープンカーソル (カーソルがアクティブの場合、2 時間のタイムアウトは適用されません)

## クラスターへの影響
<a name="long-queries-impact"></a>

**長時間実行されるクエリはガベージコレクションプロセスを妨げる可能性があります**
+ **古いバージョン累積**: ガベージコレクターは古いドキュメントバージョンを再利用できません
+ **コレクションとインデックスの肥大化**: コレクションとインデックスのエントリは時間の経過とともに蓄積され、肥大化してストレージコストが増加する可能性があります。
+ **CPU とメモリのプレッシャー**: 古いドキュメントバージョン、インデックスエントリ、トランザクション IDs。

長時間実行されるクエリ → GC をブロック → ストレージの成長 → CPU とメモリのプレッシャー → より長いクエリ

## モニタリングと検出
<a name="long-queries-monitoring"></a>

**1. 長時間実行されているクエリを検索するには、currentOp コマンドを使用します。**

```
// To find a query running for more than 30 mins
db.adminCommand({
    aggregate: 1,
    pipeline: [
        {$currentOp: {}},
        {$match: 
            {$or: 
                [{secs_running: {$gt: 1800}},
                 {WaitState: {$exists: true}}]}}],
    cursor: {}
});
```

**2. 30 分以上アクティブなカーソルを検索するには**

```
// To find cursor which is running more than 30 mins
db.adminCommand({
    "currentOp": true,
    "active": true,
    "$all": true
}).inprog.filter(function(op) {
    return op.desc == "Cursor" && 
           op.secs_running > 1800 && 
           op.active == true;
}).sort((a, b) => b.microsecs_running - a.microsecs_running)
```

**3。CloudWatch によるガベージコレクターの進行状況のモニタリング**

`LongestRunningGCProcess`— 最も長いアクティブなガベージコレクションプロセスの秒単位の期間。1 分以内に完了するプロセスを除き、1 分ごとに更新され、アクティブなオペレーションのみを追跡します。

`AvailableMVCCIds` - ゼロに達する前に使用可能な残りの書き込みオペレーションの数を示すカウンター。このカウンターがゼロに達すると、ID が再利用されてリサイクルされるまで、クラスターは読み取り専用モードになります。カウンターは書き込みオペレーションごとに減少し、ガベージコレクションが古い MVCC ID をリサイクルすると増加します。

**注記**  
低い MVCC IDs と長いガベージコレクション期間は、実行時間の長いクエリのみに起因するわけではありません。リソースに制約のあるインスタンスで書き込み負荷の高いワークロードを使用すると、MVCC ID の可用性が低下し、ガベージコレクションサイクルが長くなる可能性があります。

## 修復戦略
<a name="long-queries-remediation"></a>
+ アプリケーションにクエリタイムアウトを実装する
+ カーソルを長時間存続させないでください。
+ クエリを最適化してパフォーマンスを向上させます。
+ 書き込みオペレーションのバッチ処理を優先する