全部產品
Search
文件中心

PolarDB:Optimizer Hints

更新時間:Dec 14, 2024

PolarDB PostgreSQL版(相容Oracle)中,執行DELETE、INSERT、SELECT或UPDATE命令時,將產生多個執行計畫,然後根據預估執行成本等因素選擇最優計劃。您可以使用Optimizer Hint來影響最優執行計畫的選擇。

背景

在執行DELETE、INSERT、SELECT或UPDATE命令時,PolarDB PostgreSQL版(相容Oracle)會產生一組執行計畫。在分析這些執行計畫之後,PolarDB PostgreSQL版(相容Oracle)將選擇可以在最短的時間內返回結果集的執行計畫。

PolarDB PostgreSQL版(相容Oracle)選擇執行計畫主要從以下幾個因素考慮:

  • 資料處理操作的預估執行成本。

  • 分配給postgresql.conf檔案Query Tuning部分中參數的參數值。

  • ANALYZE命令收集的列統計資訊。

通常情況下,PolarDB PostgreSQL版(相容Oracle)將選擇執行成本最低的計劃。但是您可以這個過程中使用optimizer hint來影響最終的選擇, 即使用Optimizer Hint。

Optimizer Hint是指緊跟在DELETE、INSERT、SELECT或UPDATE命令後,類似注釋的文法中的指令。注釋中的關鍵字指示PolarDB PostgreSQL版(相容Oracle)在產生結果集時選擇或避免選擇特定的計劃。

文法

Optimizer Hint可包含在下面的任一形式中。

{ DELETE | INSERT | SELECT | UPDATE } /*+ { hint [ comment ] } [...] */
 statement_body

{ DELETE | INSERT | SELECT | UPDATE } --+ { hint [ comment ] } [...]
 statement_body
說明
  • 加號 (+) 必須緊跟在/*或--之後,中間不能添加任何空格,否則無法將對應的內容解讀為hints。

  • 以上兩種形式中,hint和注釋的展現形式略有不同:

    • 第一種文法形式,hint和注釋可以跨越多行。

    • 第二種文法形式,要求所有hint和注釋必須在一行中。

    但是兩種形式中,除了hint和注釋的其餘部分,都必須另起一行。

  • 推薦與EXPLAIN命令一起使用,可確保hint形式正確。

參數

參數

說明

hint

最佳化器提示指令。

comment

帶有附加資訊的字串。請注意,注釋中可以包含哪些字元存在限制。通常,comment 只能包含字母、數字、底線、貨幣符號、數字記號和空白字元。這些字元還必須符合標識符的文法。如果注釋並非這種形式,將忽略任何後續hint。

statement_body

DELETE、INSERT、SELECT或UPDATE命令的其餘部分。

注意事項

  • 如果通過參數設定禁用了某種執行計畫類型,那麼即使在hint中指定了該計劃,也不會使用此計劃,除非沒有其他可行的選項。參數樣本:enable_indexscan、enable_seqscan、enable_hashjoin、enable_mergejoin和enable_nestloop,均為布爾參數。

  • 由於hint是嵌入在注釋中的,如果hint拼字錯誤,或者視圖、表或列名稱等hint的任何參數拼字錯誤,或者 SQL 命令中不存在該參數,此時不會提示任何語法錯誤,只會忽略整個hint。

  • 如果在 SQL 命令中使用了別名表示表或視圖名稱,則必須在hint中使用別名,而不是原始對象名。例如,在命令 SELECT /*+ FULL(acct) */ * FROM accounts acct ..., acct 中,必須在FULL hint中指定accounts的別名,而不是表名accounts

  • 不建議在生產環境中使用optimizer hint,因為生產環境中的表資料一直會發生變化。

以下各節更詳細地介紹Optimizer Hint。