更新时间:2024-11-12 GMT+08:00
分享

指定Any子链接提升的Hint

功能描述

在进行Any子链接提升时指定优化算子的方法。

语法格式

[no] hashed_sublink[(@queryblock)], material_sublink[(@queryblock)]

参数说明

  • hashed_sublink对指定子链接使用哈希表优化。
  • material_sublink对指定子链接使用物化优化。

示例

  • material_sublink
    建表语句
    CREATE TABLE SUPPLIER (
        S_SUPPKEY BIGINT NOT NULL,
        S_NAME CHAR(25) NOT NULL,
        S_ADDRESS VARCHAR(40) NOT NULL,
        S_NATIONKEY INT NOT NULL,
        S_PHONE CHAR(15) NOT NULL,
        S_ACCTBAL DECIMAL(15, 2) NOT NULL,
        S_COMMENT VARCHAR(101) NOT NULL,
        S_STATEKEY INT NOT NULL
    );
    set explain_perf_mode = pretty; --打开explain pretty选项,可以看到更详尽计划
    示例:
    --material_sublink hint 使用 
    gaussdb=#  EXPLAIN (blockname on, costs off) SELECT max(s_acctbal) nation_total, s_nationkey
    FROM supplier WHERE s_suppkey < 10000
    GROUP BY s_nationkey having nation_total = ANY (SELECT /*+ material_sublink */ avg(s_acctbal) FROM supplier GROUP BY s_statekey);
     id |                 operation                 | Query Block 
    ----+-------------------------------------------+-------------
      1 | ->  HashAggregate                         | sel$1
      2 |    ->  Seq Scan on supplier@"sel$1"       | sel$1
      3 |    ->  Materialize  [1, SubPlan 1]        | 
      4 |       ->  HashAggregate                   | sel$2
      5 |          ->  Seq Scan on supplier@"sel$2" | sel$2
    (5 rows)
    
     Predicate Information (identified by plan id) 
    -----------------------------------------------
       1 --HashAggregate
             Filter: (SubPlan 1)
       2 --Seq Scan on supplier@"sel$1"
             Filter: (s_suppkey < 10000)
    (4 rows)

    可以看到对sublink进行了material操作,若不使用该hint,则会使用hashed。

  • hashed_sublink
    建表和准备
    set work_mem='64kB';  --将work内存缩小便于复现该场景
    set explain_perf_mode = pretty;   --打开explain pretty选项,可以看到更详尽计划
    CREATE TABLE nt1 (a int);
    CREATE TABLE nt2 (a int);
    INSERT INTO nt1 VALUES(generate_series(1, 50000));
    INSERT INTO nt2 VALUES(generate_series(1, 50000));
    示例:
    --hashed_sublink hint 使用
    gaussdb=# EXPLAIN SELECT * FROM nt1 WHERE nt1.a NOT IN (SELECT /*+ hashed_sublink no_expand*/ a FROM nt2);
     id |               operation                | E-rows | E-width |      E-costs       
    ----+----------------------------------------+--------+---------+--------------------
      1 | ->  Seq Scan on nt1                    |  49869 |       4 | 1627.725..3255.450
      2 |    ->  Seq Scan on nt2  [1, SubPlan 1] |  99738 |       4 | 0.000..1378.380
    (2 rows)
    
     Predicate Information (identified by plan id) 
    -----------------------------------------------
       1 --Seq Scan on nt1
             Filter: (NOT (hashed SubPlan 1))
    (2 rows)
    --work_mem 会对计划生成执行有所影响若后续进行其他操作需要重置:
    reset work_mem;  --将内存设置回退

    可以看到对sublink进行了hashed操作,若不使用该hint,则会使用material。

相关文档