當(dāng)您執(zhí)行DELETE、INSERT、SELECT 或 UPDATE 命令時(shí),PolarDB PostgreSQL版(兼容Oracle)會(huì)生成一組執(zhí)行計(jì)劃。在分析這些執(zhí)行計(jì)劃之后,PolarDB PostgreSQL版(兼容Oracle)將選擇可以在最短的時(shí)間內(nèi)返回結(jié)果集的執(zhí)行計(jì)劃。

PolarDB PostgreSQL版(兼容Oracle)選擇執(zhí)行計(jì)劃主要從以下幾個(gè)因素考慮:

  • 數(shù)據(jù)處理操作的預(yù)估執(zhí)行成本。
  • 分配給 postgresql.conf 文件 Query Tuning 部分中參數(shù)的參數(shù)值。
  • ANALYZE命令收集的列統(tǒng)計(jì)信息。

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

Optimizer Hint是指緊跟在 DELETE、INSERT、SELECT 或 UPDATE 命令后,類似注釋的語法中的指令。注釋中的關(guān)鍵字指示PolarDB PostgreSQL版(兼容Oracle)在生成結(jié)果集時(shí)選擇或避免選擇特定的計(jì)劃。

語法

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

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

{ DELETE | INSERT | SELECT | UPDATE } --+ { hint [ comment ] } [...]
 statement_body
說明
  • 加號(hào) (+) 必須緊跟在 /* 或 -- 之后,中間不能添加任何空格,否則無法將對(duì)應(yīng)的內(nèi)容解讀為hints。
  • 以上兩種形式中,hint和注釋的展現(xiàn)形式略有不同:第一種語法形式,hint和注釋可以跨越多行;第二種語法形式要求所有hint和注釋必須在一行中。但是兩種形式中,除了hint和注釋的其余部分,都必須另起一行。
  • 推薦與EXPLAIN命令一起使用,可確保hint形式正確。

參數(shù)

參數(shù)說明
hint優(yōu)化器提示指令。
comment帶有附加信息的字符串。請(qǐng)注意,注釋中可以包含哪些字符存在限制。通常,comment 只能包含字母、數(shù)字、下劃線、美元符號(hào)、數(shù)字符號(hào)和空格字符。這些字符還必須符合標(biāo)識(shí)符的語法。如果注釋并非這種形式,將忽略任何后續(xù)hint。
statement_bodyDELETE、INSERT、SELECT 或 UPDATE 命令的其余部分。

注意事項(xiàng)

  • 如果通過參數(shù)設(shè)置禁用了某種執(zhí)行計(jì)劃類型,那么即使在hint中指定了該計(jì)劃,也不會(huì)使用此計(jì)劃,除非沒有其他可行的選項(xiàng)。參數(shù)示例: enable_indexscan、enable_seqscan、enable_hashjoin、enable_mergejoin和 enable_nestloop,均為布爾參數(shù)。
  • 由于hint是嵌入在注釋中的,如果hint拼寫錯(cuò)誤,或者視圖、表或列名稱等hint的任何參數(shù)拼寫錯(cuò)誤,或者 SQL 命令中不存在該參數(shù),此時(shí)不會(huì)提示任何語法錯(cuò)誤,只會(huì)忽略整個(gè)hint。
  • 如果在 SQL 命令中使用了別名表示表或視圖名稱,則必須在hint中使用別名,而不是原始對(duì)象名。例如,在命令 SELECT /*+ FULL(acct) */ * FROM accounts acct ..., acct 中,必須在 FULL hint中指定 accounts 的別名,而不是表名 accounts。
  • 不建議在生產(chǎn)環(huán)境中使用optimizer hint,因?yàn)樯a(chǎn)環(huán)境中的表數(shù)據(jù)一直會(huì)發(fā)生變化。

以下各節(jié)更詳細(xì)地介紹Optimizer Hint。