全部產品
Search
文件中心

PolarDB:使用說明

更新時間:Jul 24, 2025

本文將為您介紹如何使用彈性並行查詢(Elastic Parallel Query,簡稱ePQ)。

注意事項

  • 請確認您的叢集是否支援使用彈性並行查詢。

    • 單機並行:

      • 資料庫引擎版本為8.0.1,核心小版本需為8.0.1.0.5及以上。

      • 產品版本:企業版。

    • 單機並行:

      • 資料庫引擎版本為8.0.2,核心小版本需為8.0.2.1.4.1及以上。

      • 產品版本:企業版。

    • 多機並行:

      • 資料庫引擎版本為8.0.2,核心小版本需為8.0.2.2.6及以上。

      • 產品版本:企業版。

  • 並行查詢存在使用限制和相容性問題。具體資訊,請參見使用限制和相容性問題

  • 唯讀節點和主節點都支援並行查詢功能,但主節點上的並行查詢預設關閉,您可以根據實際業務情況進行調整。具體資訊,請參考自適應調整並行度

開啟/關閉並行查詢

開啟

您可前往PolarDB控制台。在叢集基本資料頁面的資料庫連接地區,選擇目標地址,單擊配置。在編輯地址配置彈窗內,開啟並行查詢並配置並行度

詳細操作步驟請點擊此處展開

  1. 登入PolarDB控制台,在左側導覽列單擊叢集列表,選擇叢集所在地區,並單擊目的地組群ID進入叢集詳情頁。

  2. 叢集基本資料頁面的資料庫連接地區,選擇目標地址,單擊配置image

  3. 在編輯地址配置彈窗內,開啟並行查詢並配置並行度。其他參數說明,請參見設定資料庫代理imageimage

推薦設定與說明:

  • 並行度是指單個查詢在單個計算節點內最大允許同時啟動並執行worker線程數。單個查詢最大允許同時啟動並執行線程數=並行度×節點個數。

  • 並行度建議從低到高逐步增加,且不要超過CPU核心數的四分之一 。例如,剛開始使用並行查詢時,建議將並行度參數設定為2。經過一天的試運行後,如果CPU負載較低,可以繼續上調並行度;若出現較大的CPU負載,應停止上調。

  • 開啟並行查詢僅對新串連生效。

  • 控制台中的並行查詢設定與叢集參數說明如下:

    • 系統參數loose_max_parallel_degree適用於當前叢集的所有節點,對叢集中所有串連均有效。然而,在控制台中進行的調整僅對當前設定的串連地址生效。

    • 若控制台和系統參數loose_max_parallel_degree同時存在時,以控制台配置為準。因此,建議使用控制台來開啟並行查詢

    • 若控制台未開啟並行查詢,但系統參數loose_max_parallel_degree被設定為大於0時,相當於預設開啟了單機並行。

    說明

    loose_max_parallel_degree參數為單個查詢的最大並行度,即並存執行的最大Worker數量。具體資訊,請參見參數說明

關閉

您可前往PolarDB控制台。在叢集基本資料頁面的資料庫連接地區,選擇目標地址,單擊配置。在編輯地址配置彈窗內,關閉並行查詢。

詳細操作步驟請點擊此處展開

  1. 登入PolarDB控制台,在左側導覽列單擊叢集列表,選擇叢集所在地區,並單擊目的地組群ID進入叢集詳情頁。

  2. 叢集基本資料頁面的資料庫連接地區,選擇目標地址,單擊配置image

  3. 在編輯地址配置彈窗內,關閉並行查詢。image

說明:

  • 關閉並行查詢僅對新串連生效。

  • 控制台關閉並行查詢後,需要確認系統參數loose_max_parallel_degree同時為0,確保並行查詢被完全關閉。

    說明

    loose_max_parallel_degree參數為單個查詢的最大並行度,即並存執行的最大Worker數量。具體資訊,請參見參數說明

並行查詢配置

並行查詢有多個控制參數。為便於您對並行查詢進行管理,PolarDB提供了多種控制策略。以下列出部分控制策略。更多資訊,請參見並行資源控制策略配置

類型

說明

控制最佳化器是否選擇並存執行

PolarDB為您提供了兩個閾值來控制最佳化器是否選擇並存執行,SQL語句只要滿足其中任意一個條件,最佳化器就會考慮並存執行。

  • loose_records_threshold_for_parallelism

    若最佳化器估算出語句中存在掃描記錄數超過該閾值的表,最佳化器會考慮選擇並存執行計劃。預設值為10000。若您的業務量較小或複雜查詢業務並發較低,您可以選擇將該閾值設定為2000或以上。

    說明

    上文提到的掃描記錄數是根據對應表的統計資訊進行估算得出的值,可能存在一定的誤差。

  • loose_cost_threshold_for_parallelism

    若最佳化器估算查詢的串列執行代價超過該閾值,最佳化器會考慮選擇並存執行計劃。預設值為50000。

控制多機並行引擎的自適應彈性調度

PolarDB為您提供了兩個閾值來控制是否選擇多機並行,SQL語句只要滿足如下任意一個條件,並行查詢會考慮彈性擴充為多機並行。

  • loose_records_threshold_for_mpp

    若查詢語句中存在掃描記錄超過該閾值的表,最佳化器會考慮將單機並行彈性擴充為多機並行,將並行任務調度到多個節點上同時完成計算。預設值為loose_records_threshold_for_parallelism的N倍,N值為當前叢集地址內的節點個數

  • loose_cost_threshold_for_mpp

    若查詢語句的串列執行代價超過該閾值,最佳化器會考慮彈性擴充為多機並行。預設值為loose_cost_threshold_for_parallelism的N倍,N值為當前叢集地址內的節點個數

通過Hint來控制並行查詢

使用Hint文法可以對單個語句進行控制,指定最佳化器是否選擇並存執行,並支援設定並行度以及需要並行的表。例如,在系統預設關閉並行查詢的情況下,如果需要對某個高頻的慢SQL查詢進行加速,可以使用Hint對特定SQL進行加速。具體資訊,請參見並行查詢Hint文法

PolarDB讀寫叢集地址是否可以通過Hint開啟並行查詢?

可以,但優先推薦您在PolarDB控制台開啟並行查詢。如果您希望在SQL語句層級生效,可以通過Hint文法/*+ PARALLEL(n) */ 或者 /*+ SET_VAR(max_parallel_degree=n) */ 開啟並行查詢,並設定查詢的並行度為n,但兩種設定方式會有所區別:

  • 當使用/*+ PARALLEL(n) */ 時,會強制開啟並行查詢,不考慮查詢是否已經分發到RW節點,也不考慮查詢所涉及的資料量。

  • 當使用 /*+ SET_VAR(max_parallel_degree=n) */ 時,是否並行取決於查詢是否路由到RO節點,以及最佳化器所評估的查詢代價和表資料量。

在SQL語句中通過Hint設定並行參數與控制台上設定是否有衝突?

沒有衝突。通過Hint文法指定的參數僅對當前SQL生效,優先順序高於控制台上全域設定的並行參數。

使用限制和相容性問題

使用限制

PolarDB會持續迭代並行查詢的能力,目前以下情況在並行計劃中會有一定的局限性:

  • 查詢非InnoDB表,查詢無法並行。

  • 使用全文索引的查詢,查詢無法並行。

  • 包含預存程序Procedures的運算式,該運算式必須在Leader上執行。

  • Index Merge方式進行表掃描,則該表無法並行。

  • 序列化隔離等級事務內的查詢語句無法並行。

  • 隔離等級是Repeatable-read的情況下,事務內的INSERT ... SELECT/REPLACE ... SELECT查詢部分無法並行。

相容性

  • 錯誤提示次數可能會變化

    串列執行中出現錯誤提示的查詢,在並存執行的情況下,總體錯誤提示數可能會與串列有所不同。

  • 精度問題

    在並行查詢的執行過程中,可能會出現比串列執行多出中間結果儲存的情況,如果中間結果是浮點型,可能會導致浮點部分的精度差異,從而使最終結果出現細微的差別。

  • 網路包或者中間結果長度超出max_allowed_packet允許的最大長度

    在並行查詢的執行過程中,相比串列執行可能會多出中間結果。如果中間結果的長度超出了max_allowed_packet定義的最大長度,可能出現錯誤提示,可以通過增加max_allowed_packet參數的值來解決。如何修改參數請參見設定叢集參數和節點參數

  • 結果集順序差別

    當並行查詢執行未加ORDER BY關鍵字的SELECT ... LIMIT n語句時,返回的結果集可能與執行順序不一致。由於有多個Worker同時執行,每次執行時Worker的執行速度是不確定的,當Leader得到足夠的資料後,就會返回結果,因此返回的結果集可能與執行順序不一致。

  • 加了行鎖的資料記錄數增多

    當並存執行SELECT ... FROM ... FOR SHARE語句時,InnoDB會將訪問到的每一行資料都加鎖,因此加了行鎖的記錄數可能會比非並存執行的情況下要多,這屬於正常現象。

常見問題

開啟並行查詢後,所有查詢都會被並行加速嗎?

並不是所有查詢都採用並行方式執行,如下三種情況的查詢不會並行:

  • 不支援並行的查詢,詳情請參見使用限制

  • 查詢掃描的資料量或代價未達到並行的閾值,閾值設定參數為loose_records_threshold_for_parallelismloose_cost_threshold_for_parallelism

  • 當叢集資源負載過高時,查詢將不再採用並行查詢,詳情請參見系統資源控制策略

開啟並行查詢後,使用了Hint文法為什麼不生效?

可能是以下幾個原因引起的,您可以依次排查:

  • 開啟/關閉並行查詢僅對新串連生效,請您確認是否重新串連叢集。

  • 串連資料庫使用的是主地址還是叢集地址,主節點上的並行查詢預設是關閉的,建議您使用叢集地址串連資料庫。具體資訊,請參考並行資源控制策略配置