SELECT
hostname(),
*
FROM clusterAllReplicas('default', system.events)
WHERE event ILIKE '%ParallelReplicas%'
<details>
<summary>レスポンス</summary>
```response title="レスポンス"
┌─hostname()───────────────────────┬─event──────────────────────────────────────────┬─value─┬─description──────────────────────────────────────────────────────────────────────────────────────────┐
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasHandleRequestMicroseconds │ 438 │ レプリカからのマークのリクエスト処理にかかった時間 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasHandleAnnouncementMicroseconds │ 558 │ レプリカアナウンスメントの処理にかかった時間 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasReadUnassignedMarks │ 240 │ すべてのレプリカでスケジュールされた未割り当てマークの合計 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasReadAssignedForStealingMarks │ 4 │ 一貫したハッシュによってスチール用にスケジュールされたマークが割り当てられた合計 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasStealingByHashMicroseconds │ 5 │ ハッシュによってスチール用のセグメント収集にかかった時間 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasProcessingPartsMicroseconds │ 5 │ データパーツ処理にかかった時間 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasStealingLeftoversMicroseconds │ 3 │ 孤立したセグメントの収集にかかった時間 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasUsedCount │ 2 │ タスクベースの並列レプリカでクエリを実行するために使用されたレプリカの数 │
│ c-crimson-vd-86-server-rdhnsx3-0 │ ParallelReplicasAvailableCount │ 6 │ タスクベースの並列レプリカでクエリを実行するために使用可能なレプリカの数 │
└──────────────────────────────────┴────────────────────────────────────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌─hostname()───────────────────────┬─event──────────────────────────────────────────┬─value─┬─description──────────────────────────────────────────────────────────────────────────────────────────┐
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasHandleRequestMicroseconds │ 698 │ レプリカからのマークのリクエスト処理にかかった時間 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasHandleAnnouncementMicroseconds │ 644 │ レプリカアナウンスメントの処理にかかった時間 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasReadUnassignedMarks │ 190 │ すべてのレプリカでスケジュールされた未割り当てマークの合計 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasReadAssignedForStealingMarks │ 54 │ 一貫したハッシュによってスチール用にスケジュールされたマークが割り当てられた合計 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasStealingByHashMicroseconds │ 8 │ ハッシュによってスチール用のセグメント収集にかかった時間 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasProcessingPartsMicroseconds │ 4 │ データパーツ処理にかかった時間 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasStealingLeftoversMicroseconds │ 2 │ 孤立したセグメントの収集にかかった時間 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasUsedCount │ 2 │ タスクベースの並列レプリカでクエリを実行するために使用されたレプリカの数 │
│ c-crimson-vd-86-server-e9kp5f0-0 │ ParallelReplicasAvailableCount │ 6 │ タスクベースの並列レプリカでクエリを実行するために使用可能なレプリカの数 │
└──────────────────────────────────┴────────────────────────────────────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌─hostname()───────────────────────┬─event──────────────────────────────────────────┬─value─┬─description──────────────────────────────────────────────────────────────────────────────────────────┐
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasHandleRequestMicroseconds │ 620 │ レプリカからのマークのリクエスト処理にかかった時間 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasHandleAnnouncementMicroseconds │ 656 │ レプリカアナウンスメントの処理にかかった時間 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasReadUnassignedMarks │ 1 │ すべてのレプリカでスケジュールされた未割り当てマークの合計 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasReadAssignedForStealingMarks │ 1 │ 一貫したハッシュによってスチール用にスケジュールされたマークが割り当てられた合計 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasStealingByHashMicroseconds │ 4 │ ハッシュによってスチール用のセグメント収集にかかった時間 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasProcessingPartsMicroseconds │ 3 │ データパーツ処理にかかった時間 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasStealingLeftoversMicroseconds │ 1 │ 孤立したセグメントの収集にかかった時間 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasUsedCount │ 2 │ タスクベースの並列レプリカでクエリを実行するために使用されたレプリカの数 │
│ c-crimson-vd-86-server-ybtm18n-0 │ ParallelReplicasAvailableCount │ 12 │ タスクベースの並列レプリカでクエリを実行するために使用可能なレプリカの数 │
└──────────────────────────────────┴────────────────────────────────────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌─hostname()───────────────────────┬─event──────────────────────────────────────────┬─value─┬─description──────────────────────────────────────────────────────────────────────────────────────────┐
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasHandleRequestMicroseconds │ 696 │ レプリカからのマークのリクエスト処理にかかった時間 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasHandleAnnouncementMicroseconds │ 717 │ レプリカアナウンスメントの処理にかかった時間 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasReadUnassignedMarks │ 2 │ すべてのレプリカでスケジュールされた未割り当てマークの合計 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasReadAssignedForStealingMarks │ 2 │ 一貫したハッシュによってスチール用にスケジュールされたマークが割り当てられた合計 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasStealingByHashMicroseconds │ 10 │ ハッシュによってスチール用のセグメント収集にかかった時間 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasProcessingPartsMicroseconds │ 6 │ データパーツ処理にかかった時間 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasStealingLeftoversMicroseconds │ 2 │ 孤立したセグメントの収集にかかった時間 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasUsedCount │ 2 │ タスクベースの並列レプリカでクエリを実行するために使用されたレプリカの数 │
│ c-crimson-vd-86-server-16j1ncj-0 │ ParallelReplicasAvailableCount │ 12 │ タスクベースの並列レプリカでクエリを実行するために使用可能なレプリカの数 │
└──────────────────────────────────┴────────────────────────────────────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────┘
</details>
[`system.text_log`](/operations/system-tables/text_log) テーブルには、並列レプリカを使用したクエリの実行に関する情報も含まれています:
```sql title="クエリ"
SELECT message
FROM clusterAllReplicas('default', system.text_log)
WHERE query_id = 'ad40c712-d25d-45c4-b1a1-a28ba8d4019c'
ORDER BY event_time_microseconds ASC
<details>
<summary>レスポンス</summary>
```response title="レスポンス"
┌─message────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ (from 54.218.178.249:59198) SELECT * FROM session_events WHERE type='type2' LIMIT 10 SETTINGS allow_experimental_parallel_reading_from_replicas=2; (stage: Complete) │
│ クエリ SELECT __table1.clientId AS clientId, __table1.sessionId AS sessionId, __table1.pageId AS pageId, __table1.timestamp AS timestamp, __table1.type AS type FROM default.session_events AS __table1 WHERE __table1.type = 'type2' LIMIT _CAST(10, 'UInt64') SETTINGS allow_experimental_parallel_reading_from_replicas = 2 to stage Complete │
│ アクセスが許可されました: SELECT(clientId, sessionId, pageId, timestamp, type) ON default.session_events │
│ クエリ SELECT __table1.clientId AS clientId, __table1.sessionId AS sessionId, __table1.pageId AS pageId, __table1.timestamp AS timestamp, __table1.type AS type FROM default.session_events AS __table1 WHERE __table1.type = 'type2' LIMIT _CAST(10, 'UInt64') to stage WithMergeableState only analyze │
│ アクセスが許可されました: SELECT(clientId, sessionId, pageId, timestamp, type) ON default.session_events │
│ クエリ SELECT __table1.clientId AS clientId, __table1.sessionId AS sessionId, __table1.pageId AS pageId, __table1.timestamp AS timestamp, __table1.type AS type FROM default.session_events AS __table1 WHERE __table1.type = 'type2' LIMIT _CAST(10, 'UInt64') from stage FetchColumns to stage WithMergeableState only analyze │
│ クエリ SELECT __table1.clientId AS clientId, __table1.sessionId AS sessionId, __table1.pageId AS pageId, __table1.timestamp AS timestamp, __table1.type AS type FROM default.session_events AS __table1 WHERE __table1.type = 'type2' LIMIT _CAST(10, 'UInt64') SETTINGS allow_experimental_parallel_reading_from_replicas = 2 to stage WithMergeableState only analyze │
│ アクセスが許可されました: SELECT(clientId, sessionId, pageId, timestamp, type) ON default.session_events │
│ クエリ SELECT __table1.clientId AS clientId, __table1.sessionId AS sessionId, __table1.pageId AS pageId, __table1.timestamp AS timestamp, __table1.type AS type FROM default.session_events AS __table1 WHERE __table1.type = 'type2' LIMIT _CAST(10, 'UInt64') SETTINGS allow_experimental_parallel_reading_from_replicas = 2 from stage FetchColumns to stage WithMergeableState only analyze │
│ クエリ SELECT __table1.clientId AS clientId, __table1.sessionId AS sessionId, __table1.pageId AS pageId, __table1.timestamp AS timestamp, __table1.type AS type FROM default.session_events AS __table1 WHERE __table1.type = 'type2' LIMIT _CAST(10, 'UInt64') SETTINGS allow_experimental_parallel_reading_from_replicas = 2 from stage WithMergeableState to stage Complete │
│ リクエストしたレプリカの数 (100) は、クラスター内で利用可能な実際の数 (6) よりも大きいです。クエリの実行には後者の数を使用します。 │
│ 初期リクエストはレプリカ 4 から: 2 パーツ: [part all_0_2_1 with ranges [(0, 182)], part all_3_3_0 with ranges [(0, 62)]]----------
レプリカ 4 から受信 │
│ 読み取り状態が完全に初期化されています: part all_0_2_1 with ranges [(0, 182)] in replicas [4]; part all_3_3_0 with ranges [(0, 62)] in replicas [4] │
│ 初期リクエストを送信しました: 1 レプリカ数: 6 │
│ 初期リクエストはレプリカ 2 から: 2 パーツ: [part all_0_2_1 with ranges [(0, 182)], part all_3_3_0 with ranges [(0, 62)]]----------
レプリカ 2 から受信 │
│ 初期リクエストを送信しました: 2 レプリカ数: 6 │
│ レプリカ 4 からのリクエストを処理中、最小マークサイズは240です │
│ レプリカ 4 に 1 パーツ: [part all_0_2_1 with ranges [(128, 182)]] に応答を返します。終了: false; mine_marks=0, stolen_by_hash=54, stolen_rest=0 │
│ 初期リクエストはレプリカ 1 から: 2 パーツ: [part all_0_2_1 with ranges [(0, 182)], part all_3_3_0 with ranges [(0, 62)]]----------
レプリカ 1 から受信 │
│ 初期リクエストを送信しました: 3 レプリカ数: 6 │
│ レプリカ 4 からのリクエストを処理中、最小マークサイズは240です │
│ レプリカ 4 に 2 パーツ: [part all_0_2_1 with ranges [(0, 128)], part all_3_3_0 with ranges [(0, 62)]] に応答を返します。終了: false; mine_marks=0, stolen_by_hash=0, stolen_rest=190 │
│ 初期リクエストはレプリカ 0 から: 2 パーツ: [part all_0_2_1 with ranges [(0, 182)], part all_3_3_0 with ranges [(0, 62)]]----------
レプリカ 0 から受信 │
│ 初期リクエストを送信しました: 4 レプリカ数: 6 │
│ 初期リクエストはレプリカ 5 から: 2 パーツ: [part all_0_2_1 with ranges [(0, 182)], part all_3_3_0 with ranges [(0, 62)]]----------
レプリカ 5 から受信 │
│ 初期リクエストを送信しました: 5 レプリカ数: 6 │
│ レプリカ 2 からのリクエストを処理中、最小マークサイズは240です │
│ レプリカ 2 に 0 パーツ: [] に応答を返します。終了: true; mine_marks=0, stolen_by_hash=0, stolen_rest=0 │
│ 初期リクエストはレプリカ 3 から: 2 パーツ: [part all_0_2_1 with ranges [(0, 182)], part all_3_3_0 with ranges [(0, 62)]]----------
レプリカ 3 から受信 │
│ 初期リクエストを送信しました: 6 レプリカ数: 6 │
│ 読むべき総行数: 2000000 │
│ レプリカ 5 からのリクエストを処理中、最小マークサイズは240です │
│ レプリカ 5 に 0 パーツ: [] に応答を返します。終了: true; mine_marks=0, stolen_by_hash=0, stolen_rest=0 │
│ レプリカ 0 からのリクエストを処理中、最小マークサイズは240です │
│ レプリカ 0 に 0 パーツ: [] に応答を返します。終了: true; mine_marks=0, stolen_by_hash=0, stolen_rest=0 │
│ レプリカ 1 からのリクエストを処理中、最小マークサイズは240です │
│ レプリカ 1 に 0 パーツ: [] に応答を返します。終了: true; mine_marks=0, stolen_by_hash=0, stolen_rest=0 │
│ レプリカ 3 からのリクエストを処理中、最小マークサイズは240です │
│ レプリカ 3 に 0 パーツ: [] に応答を返します。終了: true; mine_marks=0, stolen_by_hash=0, stolen_rest=0 │
│ (c-crimson-vd-86-server-rdhnsx3-0.c-crimson-vd-86-server-headless.ns-crimson-vd-86.svc.cluster.local:9000) 読み取るデータが十分であるため、クエリをキャンセルします。 │
│ 81920 行を読み取り、5.16 MiB を 0.013166 秒で読み取り、6222087.194288318 行/sec., 391.63 MiB/sec. │
│ 調整完了: 統計: レプリカ 0 - {requests: 2 marks: 0 assigned_to_me: 0 stolen_by_hash: 0 stolen_unassigned: 0}; レプリカ 1 - {requests: 2 marks: 0 assigned_to_me: 0 stolen_by_hash: 0 stolen_unassigned: 0}; レプリカ 2 - {requests: 2 marks: 0 assigned_to_me: 0 stolen_by_hash: 0 stolen_unassigned: 0}; レプリカ 3 - {requests: 2 marks: 0 assigned_to_me: 0 stolen_by_hash: 0 stolen_unassigned: 0}; レプリカ 4 - {requests: 3 marks: 244 assigned_to_me: 0 stolen_by_hash: 54 stolen_unassigned: 190}; レプリカ 5 - {requests: 2 marks: 0 assigned_to_me: 0 stolen_by_hash: 0 stolen_unassigned: 0} │
│ クエリのピークメモリ使用量: 1.81 MiB。 │
│ 0.024095586 秒で処理されました。 │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
</details>
最後に、`EXPLAIN PIPELINE` を使用することもできます。これにより、ClickHouse がクエリをどのように実行し、実行にどのリソースが使用されるかが強調表示されます。以下のクエリを例に見てみましょう:
```sql
SELECT count(), uniq(pageId) , min(timestamp), max(timestamp)
FROM session_events
WHERE type='type3'
GROUP BY toYear(timestamp) LIMIT 10
並列レプリカなしでのクエリパイプラインを見てみましょう:
```sql title="EXPLAIN PIPELINE (並列レプリカなし)"
EXPLAIN PIPELINE graph = 1, compact = 0
SELECT count(), uniq(pageId) , min(timestamp), max(timestamp)
FROM session_events
WHERE type='type3'
GROUP BY toYear(timestamp)
LIMIT 10
SETTINGS allow_experimental_parallel_reading_from_replicas=0
FORMAT TSV;
<Image img={image_8} size="lg" alt="EXPLAIN without parallel_replica" />
並列レプリカありの場合:
```sql title="EXPLAIN PIPELINE (並列レプリカあり)"
EXPLAIN PIPELINE graph = 1, compact = 0
SELECT count(), uniq(pageId) , min(timestamp), max(timestamp)
FROM session_events
WHERE type='type3'
GROUP BY toYear(timestamp)
LIMIT 10
SETTINGS allow_experimental_parallel_reading_from_replicas=2
FORMAT TSV;
<Image img={image_9} size="lg" alt="EXPLAIN with parallel_replica"/>