屬性參考

本節說明最重要的組態屬性,這些屬性可用於調整 Presto 或在必要時變更其行為。

以下頁面並非 Presto 中所有可用的組態和會話屬性的完整清單,也不包含任何連接器特定的目錄組態屬性。如需目錄組態屬性的詳細資訊,請參閱連接器文件

一般屬性

join-distribution-type

  • 類型: string

  • 允許的值: AUTOMATICPARTITIONEDBROADCAST

  • 預設值: AUTOMATIC

要使用的分散式聯結類型。當設定為 PARTITIONED 時,presto 將使用雜湊分散式聯結。當設定為 BROADCAST 時,它會將右側的資料表廣播到叢集中具有左側資料表資料的所有節點。分割聯結需要使用聯結鍵的雜湊重新分配兩個資料表。這可能會比廣播聯結慢(有時會大幅度地慢),但允許更大的聯結。特別是,如果右側的資料表比左側小得多,廣播聯結會更快。但是,廣播聯結要求篩選後聯結右側的資料表必須符合每個節點的記憶體,而分散式聯結只需要符合所有節點的分散式記憶體。當設定為 AUTOMATIC 時,Presto 會根據成本決定哪個分配類型是最佳的。它也會考慮切換聯結的左右輸入。在 AUTOMATIC 模式中,如果無法計算成本,例如資料表沒有統計資料時,Presto 會預設為雜湊分散式聯結。這也可以使用 join_distribution_type 會話屬性在每個查詢的基礎上指定。

redistribute-writes

  • 類型: boolean

  • 預設值: true

此屬性可讓您在寫入之前重新分配資料。這可以透過在叢集中的節點之間進行雜湊來消除寫入時資料傾斜的效能影響。當已知輸出資料集沒有傾斜時,可以停用此功能,以避免雜湊和重新分配所有資料在網路上的負擔。這也可以使用 redistribute_writes 會話屬性在每個查詢的基礎上指定。

記憶體管理屬性

query.max-memory-per-node

  • 類型: 資料 大小

  • 預設值: JVM 最大 記憶體 * 0.1

這是查詢在工作節點上可以使用的最大使用者記憶體量。使用者記憶體在執行期間分配,用於直接歸因於或可由使用者查詢控制的事項。例如,執行期間建立的雜湊表所使用的記憶體、排序期間使用的記憶體等等。當任何工作節點上的查詢的使用者記憶體分配達到此限制時,該查詢將被終止。

query.max-total-memory-per-node

  • 類型: 資料 大小

  • 預設值: query.max-memory-per-node * 2

這是查詢在工作節點上可以使用的最大使用者和系統記憶體量。系統記憶體在執行期間分配,用於不直接歸因於或可由使用者查詢控制的事項。例如,讀取器、寫入器、網路緩衝區等分配的記憶體。當任何工作節點上的查詢分配的使用者和系統記憶體總和達到此限制時,該查詢將被終止。query.max-total-memory-per-node 的值必須大於 query.max-memory-per-node

query.max-memory

  • 類型: 資料 大小

  • 預設值: 20GB

這是查詢在整個叢集中可以使用的最大使用者記憶體量。使用者記憶體在執行期間分配,用於直接歸因於或可由使用者查詢控制的事項。例如,執行期間建立的雜湊表所使用的記憶體、排序期間使用的記憶體等等。當整個叢集中查詢的使用者記憶體分配達到此限制時,該查詢將被終止。

query.max-total-memory

  • 類型: 資料 大小

  • 預設值: query.max-memory * 2

這是查詢在整個叢集中可以使用的最大使用者和系統記憶體量。系統記憶體在執行期間分配,用於不直接歸因於或可由使用者查詢控制的事項。例如,讀取器、寫入器、網路緩衝區等分配的記憶體。當整個叢集中查詢分配的使用者和系統記憶體總和達到此限制時,該查詢將被終止。query.max-total-memory 的值必須大於 query.max-memory

memory.heap-headroom-per-node

  • 類型: 資料 大小

  • 預設值: JVM 最大 記憶體 * 0.3

這是預留作為 JVM 堆中額外空間/緩衝區的記憶體量,用於 Presto 未追蹤的分配。

query.low-memory-killer.policy

  • 類型: string

  • 預設值: none

當叢集記憶體不足 (OOM) 時,用於選擇要終止的查詢的策略。此屬性可以有以下值之一:nonetotal-reservationtotal-reservation-on-blocked-nodesnone 會停用叢集 OOM 終止器。total-reservation 的值會設定一個策略,該策略會終止整個叢集中記憶體保留量最大的查詢。total-reservation-on-blocked-nodes 的值會設定一個策略,該策略會終止在記憶體不足(已封鎖)的工作節點上使用最多記憶體的查詢。

溢出屬性

experimental.spill-enabled

  • 類型: boolean

  • 預設值: false

嘗試將記憶體溢出到磁碟,以避免超出查詢的記憶體限制。

溢出的工作方式是將記憶體卸載到磁碟。此過程可以讓具有大量記憶體佔用的查詢通過,但會犧牲執行速度。目前,僅支援聚合和聯結(內部和外部)的溢出,因此此屬性不會減少視窗函數、排序和其他聯結類型所需的記憶體使用量。

請注意,這是一個實驗性功能,應謹慎使用。

此組態屬性可以被 spill_enabled 會期屬性覆寫。

experimental.join-spill-enabled

  • 類型: boolean

  • 預設值: true

spill_enabledtrue 時,這會決定 Presto 是否會嘗試將聯結的記憶體溢出到磁碟,以避免超出查詢的記憶體限制。

此組態屬性可以被 join_spill_enabled 會期屬性覆寫。

experimental.aggregation-spill-enabled

  • 類型: boolean

  • 預設值: true

spill_enabledtrue 時,這會決定 Presto 是否會嘗試將聚合的記憶體溢出到磁碟,以避免超出查詢的記憶體限制。

此組態屬性可以被 aggregation_spill_enabled 會期屬性覆寫。

experimental.distinct-aggregation-spill-enabled

  • 類型: boolean

  • 預設值: true

aggregation_spill_enabledtrue 時,這會決定 Presto 是否會嘗試將不同聚合的記憶體溢出到磁碟,以避免超出查詢的記憶體限制。

此組態屬性可以被 distinct_aggregation_spill_enabled 會期屬性覆寫。

experimental.order-by-aggregation-spill-enabled

  • 類型: boolean

  • 預設值: true

aggregation_spill_enabledtrue 時,這會決定 Presto 是否會嘗試將 order by 聚合的記憶體溢出到磁碟,以避免超出查詢的記憶體限制。

此組態屬性可以被 order_by_aggregation_spill_enabled 會期屬性覆寫。

experimental.window-spill-enabled

  • 類型: boolean

  • 預設值: true

spill_enabledtrue 時,這會決定 Presto 是否會嘗試將視窗函數的記憶體溢出到磁碟,以避免超出查詢的記憶體限制。

此組態屬性可以被 window_spill_enabled 會期屬性覆寫。

experimental.order-by-spill-enabled

  • 類型: boolean

  • 預設值: true

spill_enabledtrue 時,這會決定 Presto 是否會嘗試將 order by 的記憶體溢出到磁碟,以避免超出查詢的記憶體限制。

此組態屬性可以被 order_by_spill_enabled 會期屬性覆寫。

experimental.spiller.task-spilling-strategy

  • 類型: string

  • 允許的值: ORDER_BY_CREATE_TIMEORDER_BY_REVOCABLE_BYTESPER_TASK_MEMORY_THRESHOLD

  • 預設值: ORDER_BY_CREATE_TIME

決定要使用哪種策略來選擇何時從哪些任務撤銷記憶體。

ORDER_BY_CREATE_TIMEORDER_BY_REVOCABLE_BYTES 將在記憶體集區填滿超過 experimental.memory-revoking-threshold 時觸發溢出,直到記憶體集區的使用率低於 experimental.memory-revoking-target 為止。ORDER_BY_CREATE_TIME 將首先從較舊的任務觸發撤銷,而 ORDER_BY_REVOCABLE_BYTES 將首先從使用更多可撤銷記憶體的任務觸發撤銷。

PER_TASK_MEMORY_THRESHOLD 將在任務使用的可撤銷記憶體超過 experimental.spiller.max-revocable-task-memory 時觸發溢出。

警告

PER_TASK_MEMORY_THRESHOLD 策略不會在記憶體集區已滿時觸發溢出,這可能會阻止記憶體不足查詢終止器啟動。如果 Presto 在沒有保留記憶體集區的情況下執行,則尤其危險。

experimental.memory-revoking-threshold

  • 類型: double

  • 最小值: 0

  • 最大值: 1

  • 預設值: 0.9

當記憶體集區填滿超過此百分比時,觸發記憶體撤銷。

experimental.memory-revoking-target

  • 類型: double

  • 最小值: 0

  • 最大值: 1

  • 預設值: 0.5

當要回收記憶體時,嘗試回收足夠的量,使記憶體池在結束時低於目標百分比。

experimental.query-limit-spill-enabled

  • 類型: boolean

  • 預設值: false

當啟用溢寫功能,且 experimental.spiller.task-spilling-strategyORDER_BY_CREATE_TIMEORDER_BY_REVOCABLE_BYTES 時,只要查詢的可撤銷、使用者和系統記憶體總和超過 query_max_total_memory_per_node,也會從查詢中溢寫可撤銷記憶體。這能讓查詢的效能更加穩定,不受叢集負載的影響,但會犧牲部分可用記憶體的效率。

experimental.spiller.max-revocable-task-memory

  • 類型: 資料 大小

  • 預設值: 500MB

如果 experimental.spiller.task-spilling-strategy 設定為 PER_TASK_MEMORY_THRESHOLD,此屬性會定義觸發任務溢寫的閾值。對於其他溢寫策略,此屬性將被忽略。

experimental.max-revocable-memory-per-node

  • 類型: 資料 大小

  • 預設值: 16GB

此屬性定義查詢在每個節點上可使用的可撤銷記憶體量。

experimental.spiller-spill-path

  • 類型: string

  • 沒有預設值。 啟用溢寫時必須設定。

溢寫內容將寫入的目錄。它可以是一個以逗號分隔的列表,以便同時溢寫到多個目錄,這有助於利用系統中安裝的多個磁碟機。

不建議溢寫到系統磁碟機。最重要的是,不要溢寫到 JVM 日誌寫入的磁碟機,因為磁碟過度使用可能會導致 JVM 暫停很長一段時間,從而導致查詢失敗。

experimental.spiller-max-used-space-threshold

  • 類型: double

  • 預設值: 0.9

如果給定溢寫路徑的磁碟空間使用率高於此閾值,則此溢寫路徑將不符合溢寫的條件。

experimental.spiller-threads

  • 類型: 整數

  • 預設值: 4

溢寫器執行緒的數量。如果預設值無法飽和底層溢寫裝置(例如,使用 RAID 時),則增加此值。

experimental.max-spill-per-node

  • 類型: 資料 大小

  • 預設值: 100 GB

單一節點上所有查詢可使用的最大溢寫空間。

experimental.query-max-spill-per-node

  • 類型: 資料 大小

  • 預設值: 100 GB

單一節點上單一查詢可使用的最大溢寫空間。

experimental.aggregation-operator-unspill-memory-limit

  • 類型: 資料 大小

  • 預設值: 4 MB

用於取消溢寫單個聚合運算子實例的記憶體限制。此組態屬性可以被 aggregation_operator_unspill_memory_limit 工作階段屬性覆寫。

experimental.spill-compression-enabled

  • 類型: boolean

  • 預設值: false

啟用溢寫到磁碟頁面的資料壓縮。

experimental.spill-encryption-enabled

  • 類型: boolean

  • 預設值: false

啟用使用隨機產生的密鑰(每個溢寫檔案)來加密和解密溢寫到磁碟的資料。

experimental.spiller.single-stream-spiller-choice

  • 類型: 字串

  • 預設值: LOCAL_FILE

啟用溢寫時要使用的單一資料流溢寫器。有兩種選項:LOCAL_FILE(預設值)和 TEMP_STORAGE。

experimental.spiller.spiller-temp-storage

  • 類型: 字串

  • 預設值: local

experimental.spiller.single-stream-spiller-choice 設定為 TEMP_STORAGE 時,溢寫器使用的暫存儲存體。

experimental.temp-storage-buffer-size

  • 類型: 資料 大小

  • 預設值: 4KB

experimental.spiller.single-stream-spiller-choice 設定為 TEMP_STORAGE 時的緩衝區大小。

交換屬性

交換會在 Presto 節點之間傳輸資料,以用於查詢的不同階段。調整這些屬性可能有助於解決節點間通訊問題或提高網路利用率。

exchange.client-threads

  • 類型: 整數

  • 最小值: 1

  • 預設值: 25

交換客戶端用於從其他 Presto 節點提取資料的執行緒數量。較高的值可以提高大型叢集或具有非常高並發性的叢集的效能,但是過高的值可能會由於上下文切換和額外的記憶體使用而導致效能下降。

exchange.concurrent-request-multiplier

  • 類型: 整數

  • 最小值: 1

  • 預設值: 3

決定相對於可用緩衝區記憶體的並發請求數的乘數。最大請求數是使用啟發式方法確定的,該方法基於每個請求的平均緩衝區使用量乘以該乘數,計算出可以放入可用緩衝區空間的客戶端數量。例如,如果 exchange.max-buffer-size32 MB,且已使用 20 MB,而每個請求的平均大小為 2MB,則最大客戶端數為 乘數 * ((32MB - 20MB) / 2MB) = 乘數 * 6。調整此值可以調整啟發式方法,這可能會增加並發性並提高網路利用率。

exchange.max-buffer-size

  • 類型: 資料 大小

  • 預設值: 32MB

交換客戶端中用於保存從其他節點提取的資料的緩衝區大小,然後再處理這些資料。較大的緩衝區可以提高較大叢集的網路吞吐量,從而縮短查詢處理時間,但是會減少可用於其他用途的記憶體量。

exchange.max-response-size

  • 類型: 資料 大小

  • 最小值: 1MB

  • 預設值: 16MB

從交換請求返回的回應的最大大小。回應將被放置在交換客戶端緩衝區中,該緩衝區在交換的所有並發請求之間共用。

如果延遲很高,則增加該值可以提高網路吞吐量。降低該值可能會提高大型叢集的查詢效能,因為它減少了由於交換客戶端緩衝區保存更多任務的回應(而不是保存來自較少任務的更多資料)而導致的偏差。

sink.max-buffer-size

  • 類型: 資料 大小

  • 預設值: 32MB

等待上游任務提取的任務資料的輸出緩衝區大小。如果任務輸出是雜湊分割的,則緩衝區將在所有分割的消費者之間共用。如果網路延遲很高或叢集中有很多節點,則增加此值可以提高階段之間傳輸資料的網路吞吐量。

任務屬性

task.concurrency

  • 類型: 整數

  • 限制: 必須是 2 的冪次方

  • 預設值: 16

平行運算子(例如聯結和聚合)的預設本地並發性。此值應根據查詢並發性和工作人員資源利用率上下調整。較低的值更適合同時執行許多查詢的叢集,因為叢集將已被所有正在執行的查詢利用,因此添加更多並發性將由於上下文切換和其他開銷而導致速度變慢。較高的值更適合一次只執行一個或幾個查詢的叢集。也可以使用 task_concurrency 工作階段屬性在每個查詢的基礎上指定此值。

task.http-response-threads

  • 類型: 整數

  • 最小值: 1

  • 預設值: 100

最多可以建立的用於處理 HTTP 回應的執行緒數。執行緒是按需建立的,並且在閒置時會清除,因此如果要處理的請求數較小,則較大的值不會產生任何開銷。在具有大量並發查詢的叢集,或具有數百或數千個工作人員的叢集中,更多執行緒可能會有所幫助。

task.http-timeout-threads

  • 類型: 整數

  • 最小值: 1

  • 預設值: 3

用於處理產生 HTTP 回應時超時的執行緒數。如果所有執行緒都經常使用,則應增加此值。可以通過 com.facebook.presto.server:name=AsyncHttpExecutionMBean:TimeoutExecutor JMX 物件進行監視。如果 ActiveCount 始終與 PoolSize 相同,則增加執行緒數。

task.info-update-interval

  • 類型: 持續時間

  • 最小值: 1毫秒

  • 最大值: 10秒

  • 預設值: 3秒

控制任務資訊的過時程度,用於排程。較大的值可以降低協調器 CPU 負載,但可能會導致次佳的分割排程。

task.max-partial-aggregation-memory

  • 類型: 資料 大小

  • 預設值: 16MB

分散式聚合的部分聚合結果的最大大小。增加此值可以減少網路傳輸並降低 CPU 使用率,方法是在刷新之前允許將更多群組保留在本地,但會增加額外的記憶體使用量。

task.max-worker-threads

  • 類型: 整數

  • 預設值: 節點 CPU * 2

設定工作節點用於處理分割的執行緒數量。如果工作節點 CPU 使用率較低且所有執行緒都在使用中,則增加此數量可以提高吞吐量,但會導致堆積空間使用量增加。將值設定得太高可能會因內容切換而導致效能下降。可以使用 com.facebook.presto.execution.executor:name=TaskExecutor.RunningSplits JXM 物件的 RunningSplits 屬性取得作用中的執行緒數量。

執行緒數量可以使用絕對值(例如,10)或相對於可用 CPU 核心數的值(例如,1.5C)進行設定。當使用相對值時,執行緒數量是根據可用的 CPU 核心數乘以指定的係數(例如,1.5)並四捨五入到最接近的整數計算得出。

task.min-drivers

  • 類型: 整數

  • 預設值: task.max-worker-threads * 2

工作節點上目標執行的葉分割數量。這是一個最小值,因為每個葉任務都保證至少有 3 個正在執行的分割。非葉任務也保證會執行,以防止死鎖。較低的值可能會提高新任務的反應速度,但可能導致資源未充分利用。較高的值可以提高資源利用率,但會使用額外的記憶體。

task.writer-count

  • 類型: 整數

  • 限制: 必須是 2 的冪次方

  • 預設值: 1

每個查詢中每個工作節點的並行寫入執行緒數量。增加此值可能會提高寫入速度,特別是在查詢不受 I/O 限制並且可以利用額外的 CPU 進行並行寫入時(某些連接器在由於壓縮或其他因素進行寫入時可能會受到 CPU 限制)。將此值設定得太高可能會導致叢集因過度使用資源而過載。也可以使用 task_writer_count 會議屬性在每個查詢的基礎上指定此值。

task.interrupt-runaway-splits-timeout

  • 類型: 持續時間

  • 預設值: 10分鐘

用於中斷在未讓出控制權的情況下被封鎖的分割執行緒的逾時時間。僅中斷在特定位置被封鎖的執行緒。目前,這僅限於在 Joni 正規表示式程式庫中被封鎖的執行緒。

節點排程器屬性

node-scheduler.max-splits-per-node

  • 類型: 整數

  • 預設值: 100

假設所有分割都具有標準分割權重,則每個工作節點可以執行的分割數量的目標值。

如果查詢以大批次提交(例如,定期執行大量報告),或者對於產生許多快速完成但不支持分配分割權重值以向分割排程器表達此情況的連接器,建議使用較高的值。增加此值可以通過確保工作節點有足夠的分割來使其充分利用來改善查詢延遲。

當連接器支援基於權重的分割排程時,分配的分割數量將取決於各個分割的權重。如果分割很小,則允許將更多分割分配給每個工作節點以進行補償。

將此值設定得太高會浪費記憶體,並可能因分割在工作節點之間不平衡而導致效能降低。理想情況下,應將其設定為始終至少有一個分割等待處理,但不應設定得更高。

node-scheduler.max-pending-splits-per-task

  • 類型: 整數

  • 預設值: 10

即使節點已達到分割總數的限制,每個工作節點可以為查詢的單個階段排隊的標準分割權重的未完成分割數量。允許每個階段有最小數量的分割是防止飢餓和死鎖所必需的。

此值必須小於 node-scheduler.max-splits-per-node,通常會因相同原因而增加,並且如果設定得太高,則會產生類似的缺點。

node-scheduler.min-candidates

  • 類型: 整數

  • 最小值: 1

  • 預設值: 10

當選擇分割的目標節點時,節點排程器將評估的候選節點的最小數量。將此值設定得太低可能會阻止分割在所有工作節點之間正確地平衡。將其設定得太高可能會增加查詢延遲並增加協調器上的 CPU 使用率。

node-scheduler.network-topology

  • 類型: string

  • 允許的值: legacyflat

  • 預設值: legacy

設定排程分割時要使用的網路拓撲。legacy 在排程分割時將忽略拓撲。flat 將嘗試通過為本地分割保留 50% 的工作佇列,在資料所在的節點上排程分割。建議在分散式儲存與 Presto 工作節點在相同節點上運行的叢集中使用 flat

最佳化工具屬性

optimizer.dictionary-aggregation

  • 類型: boolean

  • 預設值: false

啟用對字典進行聚合的優化。也可以使用 dictionary_aggregation 會議屬性在每個查詢的基礎上指定此值。

optimizer.optimize-hash-generation

  • 類型: boolean

  • 預設值: true

在執行期間儘早計算用於分發、聯結和聚合的雜湊碼,允許在查詢後續的操作之間共享結果。這可以通過避免多次計算相同的雜湊來減少 CPU 使用率,但會增加雜湊的額外網路傳輸。在大多數情況下,它會減少整體查詢處理時間。也可以使用 optimize_hash_generation 會議屬性在每個查詢的基礎上指定此值。

在使用 EXPLAIN 為了使查詢計畫更容易閱讀時,禁用此屬性通常很有幫助。

optimizer.optimize-metadata-queries

  • 類型: boolean

  • 預設值: false

通過使用存儲為元資料的值來啟用某些聚合的優化。這允許 Presto 在恆定時間內執行一些簡單的查詢。目前,此優化適用於分割區鍵的 maxminapprox_distinct,以及其他對輸入的基數不敏感的聚合(包括 DISTINCT 聚合)。使用此功能可以顯著加快某些查詢的速度。

主要的缺點是,如果連接器返回沒有行的分割區的分割區鍵,則可能會產生不正確的結果。特別是,如果 Hive 連接器是由其他系統(Presto 無法建立它們)建立的,則可以返回空的分割區。

optimizer.optimize-single-distinct

  • 類型: boolean

  • 預設值: true

單個 distinct 優化將嘗試使用單個 GROUP BY 子句替換多個 DISTINCT 子句,這樣執行速度會快得多。

optimizer.push-aggregation-through-join

  • 類型: boolean

  • 預設值: true

當聚合位於外聯結之上,並且聯結外側的所有列都在分組子句中時,聚合將被推送到外聯結下方。此優化對於相關的純量子查詢特別有用,這些查詢會被重寫為對外聯結的聚合。例如

SELECT * FROM item i
    WHERE i.i_current_price > (
        SELECT AVG(j.i_current_price) FROM item j
            WHERE i.i_category = j.i_category);

啟用此優化可以通過減少聯結需要處理的資料量來顯著加快查詢速度。但是,它可能會減慢某些具有非常選擇性聯結的查詢的速度。也可以使用 push_aggregation_through_join 會議屬性在每個查詢的基礎上指定此值。

optimizer.push-table-write-through-union

  • 類型: boolean

  • 預設值: true

在使用寫入資料的查詢中使用 UNION ALL 時並行寫入。這提高了在 UNION ALL 查詢中寫入輸出表格的速度,因為這些寫入在收集結果時不需要額外的同步。當寫入速度尚未飽和時,啟用此優化可以提高 UNION ALL 的速度。但是,它可能會減慢已經處於高負載系統中的查詢速度。也可以使用 push_table_write_through_union 會議屬性在每個查詢的基礎上指定此值。

optimizer.join-reordering-strategy

  • 類型: string

  • 允許的值: AUTOMATICELIMINATE_CROSS_JOINSNONE

  • 預設值: AUTOMATIC

要使用的連接重新排序策略。NONE 維持查詢中表格的原始順序。ELIMINATE_CROSS_JOINS 會重新排序連接,盡可能消除交叉連接,否則維持原始查詢順序。當重新排序連接時,它也會盡可能維持原始表格順序。AUTOMATIC 會列舉可能的順序,並使用基於統計資料的成本估算來決定最低成本的順序。如果統計資料不可用,或因任何原因無法計算成本,則會使用 ELIMINATE_CROSS_JOINS 策略。這也可以使用 join_reordering_strategy 會議屬性在每個查詢的基礎上指定。

optimizer.max-reordered-joins

  • 類型: 整數

  • 預設值: 9

當 optimizer.join-reordering-strategy 設定為 cost-based 時,此屬性決定一次可以重新排序的最大連接數。

警告

可能的連接順序數量會隨著關係的數量呈階乘增長,因此增加此值可能會導致嚴重的效能問題。

optimizer.use-defaults-for-correlated-aggregation-pushdown-through-outer-joins

  • 類型: boolean

  • 預設值: true

聚合有時可以被推送到外部連接之下(請參閱 optimizer.push-aggregation-through-join)。一般而言,聚合函式具有自訂的 null 處理行為。為了正確處理外部連接可能產生的 null 填充列,最佳化工具會引入後續的交叉連接,對單個 null 值執行相應的聚合,然後將連接輸出的聚合與這些 null 聚合值合併。

對於某些聚合函式(忽略 null 的那些,如 COUNT 等),可以避免交叉連接,並且可以直接將 NULL 的預設/已知聚合值與連接的聚合輸出合併。此最佳化消除了交叉連接,可能會將外部連接轉換為內部連接,從而產生更佳的計畫。

optimizer.rewrite-expression-with-constant-variable

  • 類型: boolean

  • 預設值: true

從篩選和賦值表達式中提取具有常數值的表達式,並將這些表達式替換為常數值。

optimizer.history-based-optimizer-plan-canonicalization-strategies

  • 類型: string

  • 預設值: IGNORE_SAFE_CONSTANTS

用於標準化基於歷史的最佳化查詢計畫的計畫標準化策略。

optimizer.track-history-stats-from-failed-queries

  • 類型: boolean

  • 預設值: true

追蹤失敗查詢中完整計畫片段的基於歷史的計畫統計資料。

optimizer.log-plans-used-in-history-based-optimizer

  • 類型: boolean

  • 預設值: false

記錄基於歷史的最佳化中使用的統計等效計畫和標準化計畫。

optimizer.exploit-constraints

  • 類型: boolean

  • 預設值: true

啟用查詢計畫節點之間邏輯屬性(如不同鍵或基數)的分析和傳播。然後,最佳化工具可以使用這些屬性來執行各種最佳化。

optimizer.confidence-based-broadcast

  • 類型: boolean

  • 預設值: false

啟用基於正在使用的統計資料的信賴度的廣播,透過廣播具有最高(HIGHFACT)信賴度統計資料的 joinNode 一方。如果雙方具有相同的信賴度統計資料,則會遵循原始行為。這也可以使用 confidence_based_broadcast 會議屬性在每個查詢的基礎上指定。

optimizer.treat-low-confidence-zero-estimation-as-unknown

  • 類型: boolean

  • 預設值: false

啟用在連接期間將 LOW 信賴度、零估算值視為 UNKNOWN。這也可以使用 treat-low-confidence-zero-estimation-as-unknown 會議屬性在每個查詢的基礎上指定。

optimizer.retry-query-with-history-based-optimization

  • 類型: boolean

  • 預設值: false

啟用可能透過 HBO 獲得幫助的失敗查詢的重試。這也可以使用 retry-query-with-history-based-optimization 會議屬性在每個查詢的基礎上指定。

計畫器屬性

planner.query-analyzer-timeout

  • 類型: 持續時間

  • 預設值: 3m

查詢分析器的最長執行時間,以防處理時間過長或陷入無限迴圈。當逾時到期時,計畫器執行緒會被中斷並拋出例外狀況。

正規表示式函式屬性

下列屬性允許調整正規表示式函式

regex-library

  • 類型: string

  • 允許的值: JONIRE2J

  • 預設值: JONI

要用於正規表示式函式的程式庫。 JONI 對於一般用法通常較快,但對於某些表達式模式可能需要指數時間。 RE2J 使用不同的演算法,保證線性時間,但通常較慢。

re2j.dfa-states-limit

  • 類型: 整數

  • 最小值: 2

  • 預設值: 2147483647

當 RE2J 為正規表示式比對建構快速但可能記憶體密集的決定性有限自動機 (DFA) 時,要使用的最大狀態數。如果達到限制,RE2J 會退回到使用較慢但記憶體密集度較低的非決定性有限自動機 (NFA) 的演算法。減少此值會降低正規表示式搜尋的最大記憶體佔用量,但會犧牲速度。

re2j.dfa-retries

  • 類型: 整數

  • 最小值: 0

  • 預設值: 5

RE2J 在達到狀態限制時重試 DFA 演算法的次數,然後對該搜尋的所有未來輸入使用較慢但記憶體密集度較低的 NFA 演算法。如果給定輸入列的限制很可能是一個離群值,您希望能夠使用更快的 DFA 演算法處理後續列。如果您很可能在後續列的比對中也達到限制,您希望從一開始就使用正確的演算法,以免浪費時間和資源。您處理的列越多,此值應該越大。

記錄屬性

log.max-history

  • 類型: 整數

  • 預設值: 30

log.max-history 屬性控制應用程式保留的封存記錄期間數。在 Presto 中,一個記錄期間對應於一天。例如,如果 log.max-history 設定為 30,系統將保留過去 30 天的記錄。

log.max-size

  • 類型: 資料 大小

  • 預設值: 100MB

一般應用程式記錄檔的最大檔案大小。

http-server.log.enabled

  • 類型: boolean

  • 預設值: true

啟用或停用 HTTP 伺服器的記錄的旗標。

http-server.log.compression.enabled

  • 類型: boolean

  • 預設值: true

啟用或停用 HTTP 伺服器記錄檔壓縮的旗標。

http-server.log.path

  • 類型: string

  • 預設值: var/log/http-request.log

HTTP 伺服器使用的記錄檔路徑。此路徑相對於資料目錄,由啟動腳本設定,詳情請參閱執行 Presto

http-server.log.max-history

  • 類型: 整數

  • 預設值: 15

http-server.log.max-history 屬性控制 HTTP 伺服器保留的封存記錄期間數。在 Presto 中,一個記錄期間對應於一天。例如,如果 http-server.log.max-history 設定為 15,系統將保留過去 15 天的記錄。

http-server.log.max-size

  • 類型: 資料 大小

  • 預設值: 100MB

HTTP 伺服器日誌檔的最大檔案大小。

舊版相容屬性

legacy_json_cast

  • 類型: boolean

  • 預設值: true

當從 JSON 轉換為 ROW 時,為了支援舊版功能,忽略 RowType 中欄位名稱的大小寫,使匹配不區分大小寫。將 legacy_json_cast 設定為 false,以嚴格強制匹配時雙引號括住的 RowType 中欄位名稱的大小寫。未加引號的欄位名稱匹配仍不區分大小寫。