我在 PgDay Austria 上展示 pg_hint_plan 时遇到了这个问题(我将在postgresconf.org上再次在线展示):当向查询中添加提示时, queryidin是否会改变?pg_stat_statements
简短的回答是:不,它不会改变,它queryid是根据解析后分析树计算的,忽略注释,这包括提示。
但这也回答了另一个问题:我们是否在查询文本中看到了注入的提示?这是一个小演示,表明即使从hint_plan.hints表中修改查询,queryid与查询文本相同也与没有提示相同。
我从我的演示中创建了表格:
create table a (n int primary key, x int);
create table b (n int primary key, x int);
create table c (n int primary key, x int);
create index b_index on b(x) include (n);
select pg_stat_statements_reset();
select * from c "🍒" natural join b "🍌" natural join a "🍏" ;
select queryid, calls, rows, query from pg_stat_statements;
我检查queryid来自pg_stat_statements:
yugabyte=# select * from c "🍒" natural join b "🍌" natural join a "🍏" ;
select queryid, calls, rows, query from pg_stat_statements;LOG: statement: select * from c "🍒" natural join b "🍌" natural join a "🍏" ;
n | x
---+---
(0 rows)
yugabyte=# select queryid, calls, rows, query from pg_stat_statements;
queryid | calls | rows | query
---------------------+-------+------+-----------------------------------------------------------
6990186059047281266 | 1 | 1 | select pg_stat_statements_reset()
6386600050796028530 | 1 | 0 | select * from c "🍒" natural join b "🍌" natural join a "🍏"
(2 rows)
现在有了hint_plan表格中的提示:
grant yb_extension to yugabyte;
create extension pg_hint_plan;
set pg_hint_plan.enable_hint_table=on;
insert into hint_plan.hints(norm_query_string, application_name, hints) values (
$$select * from c "🍒" natural join b "🍌" natural join a "🍏" ;$$,
$$$$,
$hints$Leading( ( ("🍏" "🍌") "🍒" ) ) HashJoin( "🍏" "🍌" ) HashJoin("🍏" "🍌" "🍒") SeqScan("🍏") IndexOnlyScan("🍌") SeqScan("🍒")$hints$
);
我看到了同样的声明 and queryid:
yugabyte=# select * from c "🍒" natural join b "🍌" natural join a "🍏" ;
select queryid, calls, rows, query from pg_stat_statements; n | x
---+---
(0 rows)
yugabyte=# select queryid, calls, rows, query from pg_stat_statements;
queryid | calls | rows | query
----------------------+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------
-4857947532354760446 | 3 | 1 | SELECT hints FROM hint_plan.hints WHERE norm_query_string = $1 AND ( application_name = $2 OR application_name = '' ) ORDER BY application_name DESC
6990186059047281266 | 1 | 1 | select pg_stat_statements_reset()
6386600050796028530 | 1 | 0 | select * from c "🍒" natural join b "🍌" natural join a "🍏"
(3 rows)
那么,我怎么知道这个提示被使用了呢?我可以启用详细日志:
yugabyte=# set pg_hint_plan.debug_print=verbose;
SET
yugabyte=# set client_min_messages = log;
SET
yugabyte=# select pg_stat_statements_reset();
LOG: statement: select pg_stat_statements_reset();
LOG: pg_hint_plan[qno=0x1a]: no match found in table: application name = "psql", normalized_query="select pg_stat_statements_reset();"
LOG: hints in comment="(none)", query="select pg_stat_statements_reset();", debug_query_string="select pg_stat_statements_reset();"
LOG: pg_hint_plan[qno=0x1c]: no match found in table: application name = "psql", normalized_query="select pg_stat_statements_reset();"
LOG: hints in comment="(none)", query="select pg_stat_statements_reset();", debug_query_string="select pg_stat_statements_reset();"
LOG: pg_hint_plan[qno=0x1a]: planner: no valid hint
pg_stat_statements_reset
--------------------------
(1 row)
yugabyte=# select * from c "🍒" natural join b "🍌" natural join a "🍏" ;
select queryid, calls, rows, query from pg_stat_statements;LOG: statement: select * from c "🍒" natural join b "🍌" natural join a "🍏" ;
LOG: pg_hint_plan[qno=0x1e]: post_parse_analyze_hook: hints from table: "Leading( ( ("🍏" "🍌") "🍒" ) ) HashJoin( "🍏" "🍌" ) HashJoin("🍏" "🍌" "🍒") SeqScan("🍏") IndexOnlyScan("🍌") SeqScan("🍒")": normalized_query="select * from c "🍒" natural join b "🍌" natural join a "🍏" ;", application name ="psql"
LOG: pg_hint_plan[qno=0x1c]: planner
LOG: pg_hint_plan[qno=0x1c]: setup_hint_enforcement index deletion: relation=16659(c), inhparent=0, current_hint_state=0xe094648, hint_inhibit_level=0, scanmask=0x1
LOG: pg_hint_plan[qno=0x1c]: setup_hint_enforcement index deletion: relation=16654(b), inhparent=0, current_hint_state=0xe094648, hint_inhibit_level=0, scanmask=0x12
LOG: pg_hint_plan[qno=0x1c]: setup_hint_enforcement index deletion: relation=16649(a), inhparent=0, current_hint_state=0xe094648, hint_inhibit_level=0, scanmask=0x1
LOG: pg_hint_plan[qno=0x1c]: HintStateDump: {used hints:IndexOnlyScan(🍌)SeqScan(🍏)SeqScan(🍒)HashJoin(🍌 🍏)HashJoin(🍌 🍏 🍒)Leading(((🍏 🍌) 🍒))}, {not used hints:(none)}, {duplicate hints:(none)}, {error hints:(none)}
n | x
---+---
(0 rows)
当pg_hint_plan.debug_print=verbose注入的提示pg_hint_plan.enable_hint_table=on在HintStateDump.
原文标题:pg_stat_statements with pg_hint_plan
原文作者:Franck Pachot
原文链接:https://dev.to/yugabyte/pgstatstatements-with-pghintplan-o1g
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




