全部产品
Search
文档中心

云原生数据库 PolarDB:Optimizer Hints

更新时间:Dec 13, 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。