更新时间:2024-11-12 GMT+08:00
指定Any子链接提升的Hint
功能描述
在进行Any子链接提升时指定优化算子的方法。
语法格式
[no] hashed_sublink[(@queryblock)], material_sublink[(@queryblock)]
参数说明
- no表示该优化的方式不使用。
- @queryblock请参见指定Hint所处于的查询块Queryblock,可省略,表示在当前查询块生效,当不指定时,hint没有括号"()"。
- 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。
父主题: 使用Plan Hint进行调优