当您执行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。