本文分享自华为云社区《你的JoinHint为什么不生效【绽放吧!GaussDB(DWS)云原生数仓】》,作者:你是猴子请来的救兵吗 。

引言

提起数据库的Hint,几乎每个DBA都知道这一强大功能。在GaussDB(DWS)中,Hint可以被用来干预SQL的执行计划,但是在日常工作中,很多开发人员对Hint的缺乏深入了解,经常遇到Hint失效的情况却又束手无策。
本次针对JoinHint从案例着手深入解析JoinHint不生效的原因,以便读者能“知其所以然”。(本文不讨论Hint的基础语法问题)。

问题案例

内核版本 GaussDB 8.1.3

问题描述 两表关联查询,使用hashjoin hint干预join方式,但hint不生效

问题用例

CREATE TABLE workitem (
language character varying(10),
userid character varying(240),
opiontype character varying(240),
processinstid character varying(240),
workitemid character varying(240),
type_name character varying(240),
type_code character varying(240),
createtime timestamp without time zone,
endtime timestamp without time zone,
notrejecttotal numeric,
dws_created_time timestamp without time zone
)
WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false)
DISTRIBUTE BY HASH(workitemid); CREATE TABLE workday (
mm timestamp with time zone,
rn numeric
)
WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false)
DISTRIBUTE BY HASH(mm); explain
SELECT /*+ hashjoin(c d) */
c.userid,c.type_name,c.type_code,count(1) num
FROM workitem c INNER JOIN workday d ON c.createtime = d.mm
WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
GROUP BY c.userid,c.type_name,c.type_code; WARNING: unused hint: HashJoin(c d)
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 2 | | 1502 | 33.12
2 | -> Vector Sonic Hash Aggregate | 2 | | 1502 | 33.12
3 | -> Vector Streaming (type: GATHER) | 4 | | 1502 | 33.12
4 | -> Vector Sonic Hash Aggregate | 4 | 16MB | 1502 | 27.12
5 | -> Vector Nest Loop (6,8) | 5 | 1MB | 1494 | 27.08
6 | -> Vector Streaming(type: BROADCAST) | 14 | 2MB | 8 | 13.68
7 | -> CStore Scan on workday d | 7 | 1MB | 8 | 13.05
8 | -> Vector Materialize | 5 | 16MB | 1502 | 13.09
9 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08 RunTime Analyze Information
-------------------------------------------
"public.workitem" runtime: 25.794ms
"public.workday" runtime: 18.098ms Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Nest Loop (6,8)
Join Filter: (c.createtime = d.mm)
7 --CStore Scan on workday d
Filter: (mm >= '2023-09-01 00:00:00'::timestamp without time zone)
Pushdown Predicate Filter: (mm >= '2023-09-01 00:00:00'::timestamp without time zone)
9 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone)) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5271KB
(33 rows)

问题定位

尝试关闭nestloop路径,来验证是否可以生成hash计划

set enable_nestloop = off;

set enable_mergejoin = off;

set enable_hashjoin = on;

WARNING:  unused hint: HashJoin(c d)
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 2 | | 1502 | 33.12
2 | -> Vector Sonic Hash Aggregate | 2 | | 1502 | 33.12
3 | -> Vector Streaming (type: GATHER) | 4 | | 1502 | 33.12
4 | -> Vector Sonic Hash Aggregate | 4 | 16MB | 1502 | 27.12
5 | -> Vector Nest Loop (6,8) | 5 | 1MB | 1494 | 27.08
6 | -> Vector Streaming(type: BROADCAST) | 14 | 2MB | 8 | 13.68
7 | -> CStore Scan on workday d | 7 | 1MB | 8 | 13.05
8 | -> Vector Materialize | 5 | 16MB | 1502 | 13.09
9 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08 Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Nest Loop (6,8)
Join Filter: (c.createtime = d.mm)
7 --CStore Scan on workday d
Filter: (mm >= '2023-09-01 00:00:00'::timestamp without time zone)
Pushdown Predicate Filter: (mm >= '2023-09-01 00:00:00'::timestamp without time zone)
9 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone)) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5271KB
(28 rows)

关闭nestloop路径后,仍然生成nestloop计划,且E-costs代价中未添加惩罚代价,说明该场景语句本身不支持hashjoin。

检查关联表达式(c.createtime = d.mm),确认是否支持hashjoin。

  • 关联表达式为字段关联,不存在函数嵌套
  • 关联表达式两边数据类型为timestamp without time zone和timestamp with time zone,通过系统表pg_operator确认是否支持hashjoin。
postgres=# select * from pg_operator where oprname = '=' and oprleft = 'timestamp'::regtype and oprright = 'timestamptz'::regtype;
-[ RECORD 1 ]+-------------------------
oprname | =
oprnamespace | 11
oprowner | 10
oprkind | b
oprcanmerge | t
oprcanhash | f
oprleft | 1114
oprright | 1184
oprresult | 16
oprcom | 2542
oprnegate | 2539
oprcode | timestamp_eq_timestamptz
oprrest | eqsel
oprjoin | eqjoinsel
  • 通过结果确认oprcanhash为false,代表该操作符不支持hash连接;原因是,左边数据不带时区,右边数据带,在比较时要先处理时区问题,不能直接拿存储值进行判断。

改善办法

通过系统表确认timestamp类型的等值关联和timestamptz的等值关联均支持hash连接。

postgres=# select * from pg_operator where oprname = '=' and oprleft = oprright and oprleft in('timestamp'::regtype,'timestamptz'::regtype);
-[ RECORD 1 ]+---------------
oprname | =
oprnamespace | 11
oprowner | 10
oprkind | b
oprcanmerge | t
oprcanhash | t
oprleft | 1184
oprright | 1184
oprresult | 16
oprcom | 1320
oprnegate | 1321
oprcode | timestamptz_eq
oprrest | eqsel
oprjoin | eqjoinsel
-[ RECORD 2 ]+---------------
oprname | =
oprnamespace | 11
oprowner | 10
oprkind | b
oprcanmerge | t
oprcanhash | t
oprleft | 1114
oprright | 1114
oprresult | 16
oprcom | 2060
oprnegate | 2061
oprcode | timestamp_eq
oprrest | eqsel
oprjoin | eqjoinsel

在关联条件上添加类型转换,保证两边类型一致,即(c.createtime::timestamptz = d.mm)或(c.createtime = d.mm::timestamp)。

postgres=# explain
postgres-# SELECT /*+ hashjoin(c d) */
postgres-# c.userid,c.type_name,c.type_code,count(1) num
postgres-# FROM workitem c INNER JOIN workday d ON c.createtime::timestamptz = d.mm
postgres-# WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
postgres-# GROUP BY c.userid,c.type_name,c.type_code;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 2 | | 1502 | 34.29
2 | -> Vector Sonic Hash Aggregate | 2 | | 1502 | 34.29
3 | -> Vector Streaming (type: GATHER) | 4 | | 1502 | 34.29
4 | -> Vector Sonic Hash Aggregate | 4 | 16MB | 1502 | 28.29
5 | -> Vector Sonic Hash Join (6,8) | 5 | 16MB | 1494 | 28.25
6 | -> Vector Streaming(type: BROADCAST) | 40 | 2MB | 8 | 15.06
7 | -> CStore Scan on workday d | 20 | 1MB | 8 | 13.01
8 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08 Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Sonic Hash Join (6,8)
Hash Cond: (d.mm = (c.createtime)::timestamp with time zone)
8 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone)) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5530KB
(24 rows) postgres=# explain
SELECT /*+ hashjoin(c d) */
c.userid,c.type_name,c.type_code,count(1) num
FROM workitem c INNER JOIN workday d ON c.createtime = d.mm::timestamp
WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
GROUP BY c.userid,c.type_name,c.type_code;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 2 | | 1502 | 32.91
2 | -> Vector Sonic Hash Aggregate | 2 | | 1502 | 32.91
3 | -> Vector Streaming (type: GATHER) | 4 | | 1502 | 32.91
4 | -> Vector Sonic Hash Aggregate | 4 | 16MB | 1502 | 26.91
5 | -> Vector Sonic Hash Join (6,8) | 5 | 16MB | 1494 | 26.87
6 | -> Vector Streaming(type: BROADCAST) | 14 | 2MB | 8 | 13.71
7 | -> CStore Scan on workday d | 7 | 1MB | 8 | 13.08
8 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08 Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Sonic Hash Join (6,8)
Hash Cond: ((d.mm)::timestamp without time zone = c.createtime)
7 --CStore Scan on workday d
Filter: ((mm)::timestamp without time zone >= '2023-09-01 00:00:00'::timestamp without time zone)
8 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone)) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5530KB
(26 rows)

知识小结

实际使用过程中导致hint生效的原因很多,这里总结排查hashjoin hint步骤以供参考:

  • 检查hint中的表名是否正确、是否存在重名、是否在当前层可见,此类场景通常在explain中会给出提示,自行排查即可。
  • 判断关联hint中的表名是否被提升导致表名不存在,此类场景通常在explain中会给出提示
postgres=# explain
SELECT /*+ hashjoin(c d) */
c.userid,c.type_name,c.type_code,count(1) num
FROM workitem c INNER JOIN (select * from workday where mm >= '2023-09-01') d ON c.createtime = d.mm::timestamp
WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
GROUP BY c.userid,c.type_name,c.type_code;
WARNING: Error hint: HashJoin(c d), relation name "d" is not found.
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 2 | | 1502 | 32.78
2 | -> Vector Sonic Hash Aggregate | 2 | | 1502 | 32.78
3 | -> Vector Streaming (type: GATHER) | 4 | | 1502 | 32.78
4 | -> Vector Sonic Hash Aggregate | 4 | 16MB | 1502 | 26.78
5 | -> Vector Sonic Hash Join (6,8) | 5 | 16MB | 1494 | 26.74
6 | -> Vector Streaming(type: BROADCAST) | 10 | 2MB | 8 | 13.58
7 | -> CStore Scan on workday | 5 | 1MB | 8 | 13.11
8 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08 Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Sonic Hash Join (6,8)
Hash Cond: ((workday.mm)::timestamp without time zone = c.createtime)
7 --CStore Scan on workday
Filter: ((mm >= '2023-09-01 00:00:00+08'::timestamp with time zone) AND ((mm)::timestamp without time zone >= '2023-09-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: (mm >= '2023-09-01 00:00:00+08'::timestamp with time zone)
8 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone)) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5530KB
(27 rows)

针对此种情况,8.2.0及以上版本可以通过添加no merge hint来禁用子查询提升从而规避hint失效问题。

通过join路径参数验证目标路径是否可生效。

--如通过关闭其他路径参数来验证某一路径是否可达
set enable_nestloop = off;
set enable_mergejoin = off;
set enable_hashjoin = on;

检查关联条件中是否存在volatile函数。

postgres=# create or replace function gettimediff(timestamp) returns interval language sql as 'select $1-timeofday()::timestamp' volatile;
CREATE FUNCTION
postgres=# explain
SELECT /*+ hashjoin(c d) */
c.userid,c.type_name,c.type_code,count(1) num
FROM workitem c INNER JOIN workday d ON gettimediff(c.createtime) = gettimediff(d.mm::timestamp)
WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
GROUP BY c.userid,c.type_name,c.type_code;
WARNING: unused hint: HashJoin(c d)
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-width | E-costs
----+-------------------------------------------------------------+--------+---------+---------
1 | -> HashAggregate | 5 | 1502 | 3.10
2 | -> Nested Loop (3,4) | 5 | 1494 | 3.00
3 | -> Data Node Scan on workitem "_REMOTE_TABLE_QUERY_" | 5 | 1502 | 0.00
4 | -> Data Node Scan on workday "_REMOTE_TABLE_QUERY_" | 20 | 8 | 0.00 Predicate Information (identified by plan id)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 --Nested Loop (3,4)
Join Filter: ((c.createtime - (timeofday())::timestamp without time zone) = ((d.mm)::timestamp without time zone - (timeofday())::timestamp without time zone))
(11 rows)

检查关联条件中两表字段是否在等号两侧,若不是则进行调整。

postgres=# explain
SELECT /*+ hashjoin(c d) */
c.userid,c.type_name,c.type_code,count(1) num
FROM workitem c INNER JOIN workday d ON ifnull(c.createtime,d.mm) = now()
WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
GROUP BY c.userid,c.type_name,c.type_code;
WARNING: unused hint: HashJoin(c d)
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 1 | | 1502 | 35.37
2 | -> Vector Sonic Hash Aggregate | 1 | | 1502 | 35.37
3 | -> Vector Streaming (type: GATHER) | 2 | | 1502 | 35.37
4 | -> Vector Sonic Hash Aggregate | 2 | 16MB | 1502 | 29.37
5 | -> Vector Nest Loop (6,8) | 2 | 1MB | 1494 | 29.35
6 | -> Vector Streaming(type: BROADCAST) | 40 | 2MB | 8 | 15.06
7 | -> CStore Scan on workday d | 20 | 1MB | 8 | 13.01
8 | -> Vector Materialize | 5 | 16MB | 1502 | 13.09
9 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08 Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Nest Loop (6,8)
Join Filter: (COALESCE((c.createtime)::timestamp with time zone, d.mm) = now())
9 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone)) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5275KB
(25 rows)

检查关联条件是否为等值关联,若不是则进行调整。

postgres=# explain
SELECT /*+ hashjoin(c d) */
c.userid,c.type_name,c.type_code,count(1) num
FROM workitem c INNER JOIN workday d ON c.createtime::timestamptz > d.mm
WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
GROUP BY c.userid,c.type_name,c.type_code;
WARNING: unused hint: HashJoin(c d)
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 5 | | 1502 | 35.41
2 | -> Vector Sonic Hash Aggregate | 5 | | 1502 | 35.41
3 | -> Vector Streaming (type: GATHER) | 10 | | 1502 | 35.41
4 | -> Vector Sonic Hash Aggregate | 10 | 16MB | 1502 | 29.41
5 | -> Vector Nest Loop (6,8) | 33 | 1MB | 1494 | 29.20
6 | -> Vector Streaming(type: BROADCAST) | 40 | 2MB | 8 | 15.06
7 | -> CStore Scan on workday d | 20 | 1MB | 8 | 13.01
8 | -> Vector Materialize | 5 | 16MB | 1502 | 13.09
9 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08 Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Nest Loop (6,8)
Join Filter: ((c.createtime)::timestamp with time zone > d.mm)
9 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone)) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5281KB
(25 rows)

检查关联关系两侧的数据类型,并通过pg_operator.oprcanhash确认是否支持hash连接,若不支持则需改写为支持的操作符。

postgres=# select * from pg_operator where oprname = '=' and oprleft = 'timestamp'::regtype and oprright = 'timestamptz'::regtype;
-[ RECORD 1 ]+-------------------------
oprname | =
oprnamespace | 11
oprowner | 10
oprkind | b
oprcanmerge | t
oprcanhash | f
oprleft | 1114
oprright | 1184
oprresult | 16
oprcom | 2542
oprnegate | 2539
oprcode | timestamp_eq_timestamptz
oprrest | eqsel
oprjoin | eqjoinsel

如果是指定join顺序的hint,如leading(c e),会存在逻辑本身冲突导致hint失败的情况。

postgres=# explain SELECT /*+ leading(c e) */
c.userid,c.type_name,c.type_code,count(1) num
FROM workitem c LEFT JOIN workday d ON c.createtime = d.mm LEFT JOIN workday e ON d.mm = e.mm
WHERE c.createtime >= '2023-09-01' AND c.endtime < '2023-10-01'
GROUP BY c.userid,c.type_name,c.type_code;
WARNING: unused hint: Leading(c e)
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | operation | E-rows | E-memory | E-width | E-costs
----+---------------------------------------------------------+--------+----------+---------+---------
1 | -> Row Adapter | 2 | | 1502 | 47.97
2 | -> Vector Sonic Hash Aggregate | 2 | | 1502 | 47.97
3 | -> Vector Streaming (type: GATHER) | 4 | | 1502 | 47.97
4 | -> Vector Sonic Hash Aggregate | 4 | 16MB | 1502 | 41.97
5 | -> Vector Nest Loop Left Join (6, 7) | 5 | 1MB | 1494 | 41.93
6 | -> CStore Scan on workitem c | 5 | 1MB | 1502 | 13.08
7 | -> Vector Materialize | 40 | 16MB | 8 | 28.00
8 | -> Vector Streaming(type: BROADCAST) | 40 | 2MB | 8 | 27.90
9 | -> Vector Hash Left Join (10, 11) | 20 | 16MB | 8 | 26.32
10 | -> CStore Scan on workday d | 20 | 1MB | 8 | 13.01
11 | -> CStore Scan on workday e | 20 | 1MB | 8 | 13.01 Predicate Information (identified by plan id)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 --Vector Nest Loop Left Join (6, 7)
Join Filter: (c.createtime = d.mm)
6 --CStore Scan on workitem c
Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
Pushdown Predicate Filter: ((createtime >= '2023-09-01 00:00:00'::timestamp without time zone) AND (endtime < '2023-10-01 00:00:00'::timestamp without time zone))
9 --Vector Hash Left Join (10, 11)
Hash Cond: (d.mm = e.mm) ====== Query Summary =====
-------------------------------
System available mem: 4710400KB
Query Max mem: 4710400KB
Query estimated mem: 5274KB
(29 rows)

检查查询语句中,from表数量是否超出from_collapse_limit,以及join表数量是否超出join_collapse_limit。超出时存在一定概率使hint无法生效。

比默认值小的数值将降低规划时间,但是可能生成差的执行计划。

postgres=# show from_collapse_limit;
from_collapse_limit
---------------------
8
(1 row) postgres=# show join_collapse_limit;
join_collapse_limit
---------------------
8
(1 row)

检查查询语句中,from表数量是否超出geqo_threshold(geqo开启的前提下),如果超出会使用基因查询优化来生成计划,存在很大概率使hint无法生效。

对于简单的查询,通常用详尽搜索方法,当涉及多个表的查询的时候,用GEQO可以更好的管理查询。

postgres=# show geqo_threshold;
geqo_threshold
----------------
12
(1 row)

点击关注,第一时间了解华为云新鲜技术~

你的JoinHint为什么不生效的更多相关文章

  1. excel 日期/数字格式不生效需要但双击才会生效的解决办法

    原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...

  2. Git忽略.gitignore规则不生效的解决办法

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件). 这个文件每一行保存了一个匹配的规则例如: # 此为 ...

  3. supervisor监管进程max file descriptor配置不生效的问题

    配置了 sudo vim /etc/security/limits.conf * soft nofile * hard nofile   单独起进程没问题, 放到supervisor下监管启动,则报错 ...

  4. 做web开发和测试,修改hosts指定某个域名访问某个特定的IP后,如何使hosts立即生效的方法

    本文转自SUN'S BLOG,原文地址:http://whosmall.com/post/143 hosts的配置方法: 在windows系统中,找到C:\windows\system32\drive ...

  5. 嵌入式 Linux下永久生效环境变量bashrc

    嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...

  6. Apache commons-configuration setDelimiterParsingDisable不生效的处理

    Apache commons-configuration setDelimiterParsingDisable不生效的处理 项目中有用到commons-configuration,版本1.9. 配置初 ...

  7. jquery动态添加的html,第三方插件无法生效的情况

    今天一个问题纠结了半天,问题如下图  问题大致就是如上,新增的内容死活点不起,插件没有生效,在一个装逼前端群里面问,给我的答案是叫我去了解事件委托,了解一下事件冒泡!! 好吧,我一上午加半个下午的时间 ...

  8. TextView属性android:ellipsize="marquee"不生效的解决办法

    最近自己在写自己的第一个app,过程中遇到了这个问题,查了不少帖子,经过尝试发现,这种问题一般分为两类: 1. TextView的Text值赋值后不更改,很多帖子上说如下写法就可以生效: <Te ...

  9. MVC项目中ExecutionTimeout不生效的解决方案

    我们做web服务器端开发时,经常会遇到一个需求场景,因为某些耗时处理造成页面的响应处理时间超长,技术角度就想能否给页面处理程序一个指定的超时时间,服务端处理程序执行时间超过这个指定的超时时间则中断处理 ...

  10. 让/etc/profile文件修改后立即生效

    方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # .  /etc/profile 注意: . 和 /etc/profile 有空格 方法2: 让/etc/profile ...

随机推荐

  1. Java算法之动态规划

    ①动态规划 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程.20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的 ...

  2. Caused by: liquibase.exception.ValidationFailedException: Validation Failed:1 change sets check sum

    db/changelog/mysql/changelog-0001-307096-1.0.sql::1.0::buoluo.meng was: 8:a5d8f616a121230c204fd2b878 ...

  3. React-Admin后台管理模板|react18+arco+zustand后台解决方案

    基于react18.x+vite4+arco-design自研中后台管理系统解决方案ReactAdmin. react-vite-admin 基于vite4搭建react18.x后台管理项目.使用了r ...

  4. CDQ分治和三维偏序

    专题:CDQ 分治 本页面将完整介绍 CDQ 分治. 简介 CDQ 分治是一种思想而不是具体的算法,与动态规划类似.目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类: 解决和点对有关的问题 ...

  5. 14.11 Socket 基于时间加密通信

    在之前的代码中我们并没有对套接字进行加密,在未加密状态下我们所有的通信内容都是明文传输的,这种方式在学习时可以使用但在真正的开发环境中必须要对数据包进行加密,此处笔者将演示一种基于时间的加密方法,该加 ...

  6. 多维评测指标解读第17届MSU世界编码器大赛全高清10bit赛道结果

    超高清视频纤毫毕现的关键一环. 01 主要指标多项第一,带宽节省48% 近日,第17届MSU世界编码器大赛全高清10bit赛道成绩揭晓,阿里自研的H.266/VVC编码器Ali266在该赛道最高效的1 ...

  7. keycloak~为keycloak-services项目添加第三方模块(首创)

    我们在对keycloak框架中的核心项目keycloak-services进行二次开发过程中,发现了一个问题,当时有这种需求,在keycloak-services中需要使用infinispan缓存,我 ...

  8. React 基础介绍以及demo实践

    这篇文章是之前给新同事培训react基础所写的文章,现贴这里供大家参考: 1.什么是React? React 是一个用于构建用户界面的JavaScript库核心专注于视图,目的实现组件化开发 2.组件 ...

  9. 可怕!.Net 8正式发布了,.Net野心确实不小!

    随着三天.NET Conf 2023的会议结束了,.Net 8正式发布了. .Net 8是官方号称有史以来性能最快的一个版本了. .Net 8 增加了数以千计的性能.稳定性和安全性改进,以及平台和工具 ...

  10. 【新手入门】JDBC+Servlet+jsp【新闻系统的增删改查】:持续学习,持续优化,争取做一个真正的新闻系统出来!

    新闻的增删改查 学习了一些博客知识[结尾会贴上,大家可以参考]在借鉴的基础上又进行了代码的优化,从而实现了CRUD,下面分享我的代码过程: 包结构,是为了方便管理,所以我们要这样进行设计: 在数据库进 ...