本文介紹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;