在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。