

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

# 提升效能的關鍵重點領域
<a name="emr-trino-performance-areas"></a>

Trino 可將查詢平行處理和記憶體最佳化最大化。此架構可讓您查詢多個不同的資料來源，同時有效率地擴展，藉此提供彈性。Trino 中效能改善的關鍵領域包括下列各項。

## 記憶體最佳化
<a name="emr-trino-performance-areas-optimization"></a>

Trino 中的記憶體管理對於實現高效能和穩定性至關重要，尤其是當您執行大型、複雜的查詢時。Trino 使用分散式記憶體模型。在此模型中，記憶體會配置到工作者節點，以處理任務、彙總、聯結和其他操作。下列清單介紹這些設定的集合：
+ **query.max-memory** – 設定整個叢集中單一查詢可用的記憶體上限。這是硬性限制；如果查詢超過此記憶體，則會失敗。
+ **query.max-memory-per-node** – 定義查詢在每個工作者節點上可以使用的最大記憶體。設定此項目可確保任何工作者上的單一查詢不會獨佔資源。
+ **JVM 堆積大小** – 在 JVM 層級設定，它會為每個節點上的 Trino 伺服器程序設定堆積大小上限。此值通常應該大於 Trino 中的記憶體相關組態 （這是 **query.max-memory-per-node** 和 **memory.heap-headroom-per-node** 的總和），以避免系統在 JVM 層級的記憶體不足。
+ **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\_id 值，然後將此子集套用為訂單的篩選條件。這表示只會掃描**訂單**中的相關資料列，也就是與篩選子集相符的 customer\_id 資料列，大幅減少處理的記錄。

## 溢出到磁碟
<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`。