

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

# パフォーマンス向上の主な重点分野
<a name="emr-trino-performance-areas"></a>

Trino は、クエリの並列性とメモリの最適化を最大化します。このアーキテクチャは、効率的にスケーリングしながら、複数のさまざまなデータソースをクエリできるようにすることで、柔軟性を提供します。Trino のパフォーマンス向上の主な分野には、以下が含まれます。

## メモリの最適化
<a name="emr-trino-performance-areas-optimization"></a>

Trino でのメモリ管理は、特に大規模で複雑なクエリを実行する場合に、高パフォーマンスと安定性を達成するために不可欠です。Trino は分散メモリモデルを使用します。このモデルでは、タスク、集約、結合、およびその他のオペレーションを処理するために、ワーカーノード間でメモリが割り当てられます。以下のリストでは、これらの設定のコレクションを紹介します:
+ **query.max-memory** – クラスター全体で 1 つのクエリに使用できる最大メモリを設定します。これはハード制限です。クエリがこのメモリを超えると失敗します。
+ **query.max-memory-per-node** – クエリが各ワーカーノードで消費できる最大メモリを定義します。これを設定することにより、単一のクエリがワーカーのリソースを独占することはありません。
+ **JVM ヒープサイズ** – JVM レベルで設定され、各ノードの Trino サーバープロセスの最大ヒープサイズを設定します。この値は、通常、JVM レベルでシステムがメモリ不足にならないように、Trino のメモリ関連の設定 (**max-memory-per-node** と **memory.heap-headroom-per-node** の合計) よりも大きくする必要があります。
+ **memory.heap-headroom-per-node** – 非クエリオペレーションのために JVM ヒープサイズから残すメモリのバッファ量を指定します。これは、内部オペレーションとガベージコレクションに十分なオーバーヘッドを確保するために不可欠です。

## 動的フィルタリング
<a name="emr-trino-performance-areas-dynamic"></a>

Trino の動的フィルタリングは、特に結合中に処理されるデータ量を減らすことでクエリのパフォーマンスを向上させる最適化手法です。フィルタ条件を動的に適用して、結合の一方の側でスキャンされたデータを、もう一方の側で見られるデータに基づいて制限します。これは、結合の一方の側が非常に選択的である (つまり、データの小さなサブセットを含む) クエリで特に便利です。Amazon EMR ではデフォルトで有効になっています。以下はクエリの例です。

```
SELECT orders.order_id, orders.total_amount
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE customers.country = 'France';
```

動的フィルタリングがない場合、Trino は、少数の顧客 (フランスからの顧客) のサブセットのみが関連している場合でも、結合で注文テーブル全体をスキャンします。このアプローチは、**注文**テーブルのすべての行を読み取るため、I/O と処理コストが高くなります。動的フィルタリングでは、Trino は最初に小さな**顧客**テーブルをスキャンし、フランスから顧客のみの customer\$1id 値を取得し、このサブセットを注文のフィルターとして適用します。つまり、フィルタリングされたサブセットに一致する customer\$1id を持つ**注文**の関連する行のみがスキャンされ、処理されるレコードが大幅に削減されます。

## スピルからディスクへ
<a name="emr-trino-performance-areas-spill"></a>

 Trino では、ディスクのスピルにより、中間クエリ結果をディスクにオフロードできるので、メモリを大量に消費するクエリは、`query_max_memory` または `query_max_memory_per_node` によって設定されたメモリ制限を超えた場合でも完了できます。デフォルトでは、Trino はこれらの制限を適用して、公平なメモリ割り当てを確保し、クラスターのデッドロックを防ぎます。ただし、大きなクエリがこれらの制限を超えると、終了のリスクがあります。ディスクのスピリングでは、`revocable memory` を使用してこれに対処します。これにより、リソースが他の場所で必要になった場合に取り消すことができる追加のメモリをクエリで借用できます。メモリが取り消されると、中間データがディスクにスピルされるため、クエリはメモリ制限を超えることなく処理を継続できます。ディスクに強制的にスピルされるクエリの実行時間が長くなる可能性があるので、デフォルトでは無効になっていることに注意してください。Amazon EMR でスピルを有効にするには、以下の設定を使用します:
+ `spill-enabled=true` – メモリ使用量が使用可能なしきい値を超えた場合にディスクのスピルを有効にします。
+ `spill-paths` – 流出したデータが保存されるディレクトリ `spill-paths=/mnt/spill` を定義します。