本文介绍PolarDB PostgreSQL版(兼容Oracle)的OPT_PARAM Hint。
如果通过传统的方式指定特定参数值,通常是在数据库级别、会话级别或者用户级别下进行的,无法精确控制执行特定SQL时使用的参数值。此时可以使用OPT_PARAM Hint实现在SQL级别指定特定参数值,将参数的修改范围控制在SQL级别,指定的参数值仅在该SQL中有效。
语法
SELECT /*+ opt_param("enable_hashjoin" "off"),
opt_param("enable_mergejoin" "off") */ ...;
参数说明
当前OPT_PARAM Hint支持指定以下参数的值:
参数 | 参数说明 |
---|---|
enable_hashjoin | 允许或禁止查询规划器使用哈希连接计划类型。 |
enable_mergejoin | 允许或禁止查询规划器使用归并连接计划类型。 |
enable_nestloop | 允许或禁止查询规划器使用嵌套循环连接计划。它不可能完全禁止嵌套循环连接,但是关闭这个变量将使得规划器尽可能优先使用其他方法。 |
enable_bitmapscan | 允许或禁止查询规划器使用位图扫描计划类型。 |
enable_indexonlyscan | 允许或禁止查询规划器仅用索引扫描计划类型。 |
enable_indexscan | 允许或禁止查询规划器使用索引扫描计划类型。 |
enable_material | 允许或禁止查询规划器使用物化。不可能完全抑制物化,但是关闭这个变量会阻止规划器插入物化节点。 |
enable_seqscan | 允许或禁止查询规划器使用顺序扫描计划类型。它不可能完全禁止顺序扫描,但是关闭这个变量将使得规划器尽可能优先使用其他方法。 |
enable_sort | 允许或禁止查询规划器使用显式排序步骤。它不可能完全禁止显式排序,但是关闭这个变量将使得规划器尽可能优先使用其他方法。 |
enable_tidscan | 允许或禁止规划器使用TID扫描规划类型。 |
enable_gathermerge | 允许或禁止查询器使用收集归并计划类型。 |
enable_hashagg | 允许或禁用查询规划器使用哈希聚集计划类型。 |
enable_parallel_append | 允许或禁止查询规划器使用并行追加计划类型。 |
enable_parallel_hash | 允许或禁止查询规划器对并行哈希使用哈希连接计划类型。如果哈希连接计划没有启用,则此参数不生效。 |
enable_partition_pruning | 允许或禁止查询规划器从查询计划中消除一个分区表的分区。同时也控制着规划器产生允许执行器在查询执行期间移除(忽略)分区的查询计划的能力。 |
enable_partitionwise_aggregate | 允许或禁止查询规划器使用面向分区的分组或聚集,这使得在分区表上的分组或聚集可以在每个分区上分别执行。如果GROUP BY子句不包括分区键,只有部分聚集能够以基于每个分区的方式执行,并且finalization必须最后执行。 |
enable_partitionwise_join | 允许或禁止查询规划器使用面向分区的连接,这使得分区表之间的连接以连接匹配分区的方式来执行。面向分区的连接当前只适用于连接条件包括所有分区键的情况,连接条件必须是相同的数据类型并且子分区集合需要1对1匹配。 |
示例
不使用OPT_PARAM Hint:
EXPLAIN (COSTS OFF) SELECT * FROM sampletable WHERE x < 423;
使用OPT_PARAM Hint,将enable_bitmapscan参数设置为off,禁止查询规划器使用位图扫描计划类型:
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_bitmapscan" "off") */ * FROM sampletable WHERE x < 423;
使用OPT_PARAM Hint,将enable_mergejoin参数设置为off,禁止查询规划器使用归并连接计划类型:
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_mergejoin" "off") */ tt1.*, tt2.* FROM tt1 JOIN tt2 on tt1.joincol = tt2.joincol;
使用OPT_PARAM Hint,将enable_hashjoin参数设置为on,禁止查询规划器使用哈希连接计划类型:
EXPLAIN (COSTS OFF) SELECT/*+ opt_param("enable_hashjoin" "on") */ tt1.*, tt2.* FROM tt1 JOIN tt2 on tt1.joincol = tt2.joincol;