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