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