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