PostgreSQL码农集散地

PostgreSQL 18 preview - 新增 GUC: query_id_squash_values支持IN查询混淆开关

PostgreSQL 18 preview - 新增 GUC: query_id_squash_values 支持SQL IN查询混淆开关

对于包含大量常量列表的查询(例如 SELECT something FROM table WHERE col IN (1, 2, 3, ...)),pg_stat_statements 可能会生成多个条目,因为 ArrayExpr 中的每个元素都会被单独混淆。

这会导致 pg_stat_statements 中出现大量重复的条目,尤其是在列表变得非常大的时候,这通常是不希望看到的。

这个patch 引入新的 GUC 参数 query_id_squash_values。当 query_id_squash_values 设置为 on 时,查询混淆代码只会考虑常量列表的第一个和最后一个元素,而不是单独考虑每个元素。pg_stat_statements 的查询规范化,使其抑制打印此类列表的各个元素。  这意味着 pg_stat_statements 会将 SELECT something FROM table WHERE col IN (1, 2, 3, ...) 规范化为 SELECT something FROM table WHERE col IN (...),从而避免记录具体的常量值。

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=62d712ecfd940f60e68bde5b6972b6859937c412

Introduce squashing of constant lists in query jumbling  

pg_stat_statements produces multiple entries for queries like  
    SELECT something FROM table WHERE col IN (1, 2, 3, ...)  

depending on the number of parameters, because every element of  
ArrayExpr is individually jumbled.  Most of the time that's undesirable,  
especially if the list becomes too large.  

Fix this by introducing a new GUC query_id_squash_values which modifies  
the node jumbling code to only consider the first and last element of a  
list of constants, rather than each list element individually.  This  
affects both the query_id generated by query jumbling, as well as  
pg_stat_statements query normalization so that it suppresses printing of  
the individual elements of such a list.  

The default value is off, meaning the previous behavior is maintained.  

Author: Dmitry Dolgov <[email protected]>  
Reviewed-by: Sergey Dudoladov (mysterious, off-list)  
Reviewed-by: David Geier <[email protected]>  
Reviewed-by: Robert Haas <[email protected]>  
Reviewed-by: Álvaro Herrera <[email protected]>  
Reviewed-by: Sami Imseih <[email protected]>  
Reviewed-by: Sutou Kouhei <[email protected]>  
Reviewed-by: Tom Lane <[email protected]>  
Reviewed-by: Michael Paquier <[email protected]>  
Reviewed-by: Marcos Pegoraro <[email protected]>  
Reviewed-by: Julien Rouhaud <[email protected]>  
Reviewed-by: Zhihong Yu <[email protected]>  
Tested-by: Yasuo Honda <[email protected]>  
Tested-by: Sergei Kornilov <[email protected]>  
Tested-by: Maciek Sakrejda <[email protected]>  
Tested-by: Chengxi Sun <[email protected]>  
Tested-by: Jakub Wartak <[email protected]>  
Discussion: https://postgr.es/m/CA+q6zcWtUbT_Sxj0V6HY6EZ89uv5wuG5aefpe_9n0Jr3VwntFg@mail.gmail.com  

AI 解读

核心内容:

这个补丁引入了一个新的 GUC 参数 query_id_squash_values,用于在查询混淆 (query jumbling) 和 pg_stat_statements 查询规范化过程中,将常量列表(例如 IN (1, 2, 3, ...) 中的列表)进行“压缩”。

背景和问题:

  • pg_stat_statements 是一个 PostgreSQL 扩展,用于跟踪查询的执行统计信息。
  • 查询混淆 (query jumbling) 是一种技术,用于生成查询的唯一 ID,以便 pg_stat_statements 可以正确地聚合相似的查询。
  • 对于包含大量常量列表的查询(例如 SELECT something FROM table WHERE col IN (1, 2, 3, ...)),pg_stat_statements 可能会生成多个条目,因为 ArrayExpr 中的每个元素都会被单独混淆。
  • 这会导致 pg_stat_statements 中出现大量重复的条目,尤其是在列表变得非常大的时候,这通常是不希望看到的。

解决方案:

  • 引入新的 GUC 参数 query_id_squash_values。
  • 当 query_id_squash_values 设置为 on 时,查询混淆代码只会考虑常量列表的第一个和最后一个元素,而不是单独考虑每个元素。
  • 这会影响:
    • 查询混淆生成的 query_id,使得包含相同类型但不同值的常量列表的查询生成相同的 query_id。
    • pg_stat_statements 的查询规范化,使其抑制打印此类列表的各个元素。  这意味着 pg_stat_statements 会将 SELECT something FROM table WHERE col IN (1, 2, 3, ...) 规范化为 SELECT something FROM table WHERE col IN (...),从而避免记录具体的常量值。

默认行为:

  • query_id_squash_values 的默认值为 off,这意味着保持之前的行为。  只有在显式启用该参数后,才会启用常量列表压缩。

总结:

这个补丁通过引入 query_id_squash_values 参数,解决了 pg_stat_statements 在处理包含大量常量列表的查询时生成过多重复条目的问题。  通过压缩常量列表,可以减少 pg_stat_statements 中的条目数量,提高其性能和可管理性。  同时,保留了默认行为,允许用户根据需要选择启用该功能。

关键术语解释:

  • GUC (Grand Unified Configuration):  PostgreSQL 的配置参数。
  • 查询混淆 (Query Jumbling):  一种生成查询唯一 ID 的技术。
  • pg_stat_statements:  一个 PostgreSQL 扩展,用于跟踪查询的执行统计信息。
  • 查询规范化 (Query Normalization):  将相似的查询转换为相同的形式,以便可以聚合它们的统计信息。
  • ArrayExpr:  表示数组表达式的 PostgreSQL 内部数据结构。
  • 常量列表 (Constant List):  例如 IN (1, 2, 3, ...) 中的 (1, 2, 3, ...) 部分。
  • 抑制 (Suppress):  阻止显示或记录某些信息。

总而言之,这个补丁是一个针对 pg_stat_statements 的优化,通过压缩常量列表来减少重复条目,提高其性能和可管理性。  query_id_squash_values 参数提供了一种灵活的方式来控制是否启用该优化。