Skip to content

Instantly share code, notes, and snippets.

@yahonda
Last active April 4, 2024 23:25
Show Gist options
  • Save yahonda/825ffccc4dcb58aa60e12ce33d25cd45 to your computer and use it in GitHub Desktop.
Save yahonda/825ffccc4dcb58aa60e12ce33d25cd45 to your computer and use it in GitHub Desktop.
Test pg_stat_statements and "IN" conditions patches

This entry shows the test result of https://www.postgresql.org/message-id/flat/CA%2Bq6zcWtUbT_Sxj0V6HY6EZ89uv5wuG5aefpe_9n0Jr3VwntFg%40mail.gmail.com

Steps to reproduce

  1. Download these 4 patch files
$ wget https://www.postgresql.org/message-id/attachment/154675/v18-0001-Prevent-jumbling-of-every-element-in-ArrayExpr.patch
$ wget https://www.postgresql.org/message-id/attachment/154676/v18-0002-Reusable-decimalLength-functions.patch
$ wget https://www.postgresql.org/message-id/attachment/154677/v18-0003-Merge-constants-in-ArrayExpr-into-groups.patch
$ wget https://www.postgresql.org/message-id/attachment/154678/v18-0004-Introduce-query_id_const_merge_threshold.patch
  1. checkout a pg_stat_statements branch from 0eb23285a2 to avoid conflicts with the latest master branch
$ git checkout 0eb23285a2 -b pg_stat_statements
  1. Apply these 4 patches using git am command
$ git am v18-0001-Prevent-jumbling-of-every-element-in-ArrayExpr.patch
Applying: Prevent jumbling of every element in ArrayExpr

$ git am v18-0002-Reusable-decimalLength-functions.patch
Applying: Reusable decimalLength functions

$ git am v18-0003-Merge-constants-in-ArrayExpr-into-groups.patch
Applying: Merge constants in ArrayExpr into groups

$ git am v18-0004-Introduce-query_id_const_merge_threshold.patch
Applying: Introduce query_id_const_merge_threshold
  1. Confirmed these 4 patches are applied
$ git log --oneline | head -n 5
9439c28ea4 Introduce query_id_const_merge_threshold
3396955b35 Merge constants in ArrayExpr into groups
a29314c2d6 Reusable decimalLength functions
44ceb8dba4 Prevent jumbling of every element in ArrayExpr
0eb23285a2 Fix two memcpy() bugs in the new injection point code
$

This branch has been pushed to https://github.com/yahonda/postgres/tree/pg_stat_statements

  1. Build PostgreSQL locally
#!/bin/bash

cd $HOME/pgsql/master
pg_ctl -D data stop
rm -rf data
rm -rf logfile
cd ..
cd $HOME
rm -rf pgsql

cd $HOME/src/github.com/postgres/postgres
meson setup build --wipe
meson setup build --prefix=$HOME/pgsql/master -Duuid=ossp -Dssl=openssl -Dllvm=enabled
cd build
ninja
ninja install
cd $HOME/pgsql/master
bin/initdb -D data --encoding=UTF8
bin/pg_ctl -D data -l logfile start
  1. Enable pg_stat_statements
$ cd $HOME/pgsql/master
$ bin/psql -d postgres
psql (17devel)
Type "help" for help.

postgres=# ALTER SYSTEM SET shared_preload_libraries TO 'pg_stat_statements';
ALTER SYSTEM
postgres=# \q
$ bin/pg_ctl -D data stop
waiting for server to shut down.... done
server stopped
$ bin/pg_ctl -D data -l logfile start
waiting for server to start.... done
server started
$ bin/psql -d postgres
psql (17devel)
Type "help" for help.

postgres=# SHOW shared_preload_libraries;
 shared_preload_libraries
--------------------------
 pg_stat_statements
(1 row)

postgres=# CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION
  1. Prepare test database
postgres=# create database test;
CREATE DATABASE
postgres=# select pg_stat_statements_reset();
   pg_stat_statements_reset
-------------------------------
 2024-03-24 21:30:46.746412+09
(1 row)
postgres=# select query from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
 query
-------
(0 rows)
  1. Reset pg_stat_statements entries and use the default query_id_const_merge_threshold
postgres=# select pg_stat_statements_reset();
   pg_stat_statements_reset
-------------------------------
 2024-03-24 23:10:48.667495+09
(1 row)

postgres=# reset pg_stat_statements.query_id_const_merge_threshold;
RESET
postgres=# show pg_stat_statements.query_id_const_merge_threshold;
 pg_stat_statements.query_id_const_merge_threshold
---------------------------------------------------
 0
(1 row)
  1. Run active_record2.rb to run prepared statements whose number of in clause changing from 1 to 10.
# frozen_string_literal: true

require "bundler/inline"

gemfile(true) do
  source "https://rubygems.org"

  git_source(:github) { |repo| "https://github.com/#{repo}.git" }

  # gem "rails", path: "/home/yahonda/src/github.com/rails/rails"
  # If you want to test against edge Rails replace the previous line with this:
  gem "rails", github: "rails/rails", branch: "main"

  gem "pg"
end

require "active_record"
require "minitest/autorun"
require "logger"

# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: "postgresql", database: "test")
ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveRecord::Schema.define do
  create_table :posts, force: true do |t|
  end
end

class Post < ActiveRecord::Base
end

class BugTest < Minitest::Test
  def test_post_count
    (1..10).each do |i|
      post = Post.create!
      post = Post.where(id: (1 .. i).to_a)
      assert_equal i, post.count
    end
  end
end
$ ruby active_record2.rb
Fetching https://github.com/rails/rails.git
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
-- create_table(:posts, {:force=>true})
D, [2024-03-24T23:11:13.522093 #50079] DEBUG -- :    (4.8ms)  DROP TABLE IF EXISTS "posts"
D, [2024-03-24T23:11:13.530299 #50079] DEBUG -- :    (7.5ms)  CREATE TABLE "posts" ("id" bigserial primary key)
   -> 0.0287s
D, [2024-03-24T23:11:13.568472 #50079] DEBUG -- :   ActiveRecord::InternalMetadata Load (1.0ms)  SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1  [[nil, "environment"]]
Run options: --seed 52174

# Running:

D, [2024-03-24T23:11:13.701165 #50079] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:11:13.701902 #50079] DEBUG -- :   Post Create (0.8ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.704722 #50079] DEBUG -- :   TRANSACTION (2.6ms)  COMMIT
D, [2024-03-24T23:11:13.715410 #50079] DEBUG -- :   Post Count (0.6ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1  [["id", 1]]
D, [2024-03-24T23:11:13.716363 #50079] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:11:13.716679 #50079] DEBUG -- :   Post Create (0.8ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.718210 #50079] DEBUG -- :   TRANSACTION (1.1ms)  COMMIT
D, [2024-03-24T23:11:13.719218 #50079] DEBUG -- :   Post Count (0.5ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2)  [["id", 1], ["id", 2]]
D, [2024-03-24T23:11:13.719880 #50079] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:11:13.720215 #50079] DEBUG -- :   Post Create (0.5ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.721669 #50079] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:11:13.722522 #50079] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3)  [["id", 1], ["id", 2], ["id", 3]]
D, [2024-03-24T23:11:13.723505 #50079] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:11:13.723792 #50079] DEBUG -- :   Post Create (0.4ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.724850 #50079] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:11:13.725687 #50079] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4)  [["id", 1], ["id", 2], ["id", 3], ["id", 4]]
D, [2024-03-24T23:11:13.726630 #50079] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:11:13.726992 #50079] DEBUG -- :   Post Create (0.8ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.728066 #50079] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:11:13.729162 #50079] DEBUG -- :   Post Count (0.4ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5]]
D, [2024-03-24T23:11:13.730044 #50079] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:11:13.730332 #50079] DEBUG -- :   Post Create (0.5ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.731514 #50079] DEBUG -- :   TRANSACTION (1.0ms)  COMMIT
D, [2024-03-24T23:11:13.732400 #50079] DEBUG -- :   Post Count (0.4ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6]]
D, [2024-03-24T23:11:13.733224 #50079] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:11:13.733489 #50079] DEBUG -- :   Post Create (0.7ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.734586 #50079] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:11:13.735431 #50079] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7]]
D, [2024-03-24T23:11:13.736324 #50079] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:11:13.736600 #50079] DEBUG -- :   Post Create (0.7ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.737670 #50079] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:11:13.738977 #50079] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8]]
D, [2024-03-24T23:11:13.739888 #50079] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:11:13.740149 #50079] DEBUG -- :   Post Create (0.4ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.741213 #50079] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:11:13.742075 #50079] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9]]
D, [2024-03-24T23:11:13.743205 #50079] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:11:13.743499 #50079] DEBUG -- :   Post Create (0.5ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.744550 #50079] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:11:13.745376 #50079] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9], ["id", 10]]
.

Finished in 0.056451s, 17.7146 runs/s, 177.1459 assertions/s.
1 runs, 10 assertions, 0 failures, 0 errors, 0 skips
$
  1. Query pg_stat_statements that has 10 entries for each query.
postgres=# select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
                                            query                                             | calls
----------------------------------------------------------------------------------------------+-------
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1                                         |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2)                                  |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3)                              |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4)                          |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5)                      |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6)                  |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7)              |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8)          |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9)      |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) |     1
(10 rows)
  1. Set query_id_const_merge_threshold to 5
postgres=# SET pg_stat_statements.query_id_const_merge_threshold = 5;
SET
postgres=# show pg_stat_statements.query_id_const_merge_threshold;
 pg_stat_statements.query_id_const_merge_threshold
---------------------------------------------------
 5
(1 row)

postgres=# select pg_stat_statements_reset();
   pg_stat_statements_reset
-------------------------------
 2024-03-24 23:11:54.204133+09
(1 row)
  1. Run the same active_record2.rb to run prepared statements whose number of in clause changing from 1 to 10.
$ ruby active_record2.rb
Fetching https://github.com/rails/rails.git
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
-- create_table(:posts, {:force=>true})
D, [2024-03-24T23:12:01.579614 #50152] DEBUG -- :    (6.4ms)  DROP TABLE IF EXISTS "posts"
D, [2024-03-24T23:12:01.590816 #50152] DEBUG -- :    (10.5ms)  CREATE TABLE "posts" ("id" bigserial primary key)
   -> 0.0335s
D, [2024-03-24T23:12:01.636888 #50152] DEBUG -- :   ActiveRecord::InternalMetadata Load (0.9ms)  SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1  [[nil, "environment"]]
Run options: --seed 17104

# Running:

D, [2024-03-24T23:12:01.765773 #50152] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:12:01.766516 #50152] DEBUG -- :   Post Create (1.0ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.768371 #50152] DEBUG -- :   TRANSACTION (1.1ms)  COMMIT
D, [2024-03-24T23:12:01.778982 #50152] DEBUG -- :   Post Count (0.6ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1  [["id", 1]]
D, [2024-03-24T23:12:01.780016 #50152] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:12:01.780335 #50152] DEBUG -- :   Post Create (0.6ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.781940 #50152] DEBUG -- :   TRANSACTION (1.1ms)  COMMIT
D, [2024-03-24T23:12:01.783210 #50152] DEBUG -- :   Post Count (0.5ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2)  [["id", 1], ["id", 2]]
D, [2024-03-24T23:12:01.783912 #50152] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:12:01.784209 #50152] DEBUG -- :   Post Create (0.5ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.785752 #50152] DEBUG -- :   TRANSACTION (1.0ms)  COMMIT
D, [2024-03-24T23:12:01.786827 #50152] DEBUG -- :   Post Count (0.4ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3)  [["id", 1], ["id", 2], ["id", 3]]
D, [2024-03-24T23:12:01.787732 #50152] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:12:01.788061 #50152] DEBUG -- :   Post Create (0.5ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.789486 #50152] DEBUG -- :   TRANSACTION (1.2ms)  COMMIT
D, [2024-03-24T23:12:01.790541 #50152] DEBUG -- :   Post Count (0.4ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4)  [["id", 1], ["id", 2], ["id", 3], ["id", 4]]
D, [2024-03-24T23:12:01.791282 #50152] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:12:01.791606 #50152] DEBUG -- :   Post Create (0.5ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.793291 #50152] DEBUG -- :   TRANSACTION (1.1ms)  COMMIT
D, [2024-03-24T23:12:01.794491 #50152] DEBUG -- :   Post Count (0.4ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5]]
D, [2024-03-24T23:12:01.795535 #50152] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:12:01.795842 #50152] DEBUG -- :   Post Create (0.5ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.797030 #50152] DEBUG -- :   TRANSACTION (1.0ms)  COMMIT
D, [2024-03-24T23:12:01.798178 #50152] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6]]
D, [2024-03-24T23:12:01.798823 #50152] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:12:01.799100 #50152] DEBUG -- :   Post Create (0.4ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.800201 #50152] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:12:01.801601 #50152] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7]]
D, [2024-03-24T23:12:01.802372 #50152] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:12:01.802635 #50152] DEBUG -- :   Post Create (0.6ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.804062 #50152] DEBUG -- :   TRANSACTION (1.0ms)  COMMIT
D, [2024-03-24T23:12:01.804958 #50152] DEBUG -- :   Post Count (0.4ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8]]
D, [2024-03-24T23:12:01.805835 #50152] DEBUG -- :   TRANSACTION (0.2ms)  BEGIN
D, [2024-03-24T23:12:01.806099 #50152] DEBUG -- :   Post Create (0.7ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.807209 #50152] DEBUG -- :   TRANSACTION (0.9ms)  COMMIT
D, [2024-03-24T23:12:01.808017 #50152] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9]]
D, [2024-03-24T23:12:01.808834 #50152] DEBUG -- :   TRANSACTION (0.1ms)  BEGIN
D, [2024-03-24T23:12:01.809099 #50152] DEBUG -- :   Post Create (0.6ms)  INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.810268 #50152] DEBUG -- :   TRANSACTION (1.0ms)  COMMIT
D, [2024-03-24T23:12:01.811390 #50152] DEBUG -- :   Post Count (0.3ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)  [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9], ["id", 10]]
  1. Query pg_stat_statements that has 10 entries for each query.
postgres=# select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
                                            query                                             | calls
----------------------------------------------------------------------------------------------+-------
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1                                         |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2)                                  |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3)                              |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4)                          |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5)                      |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6)                  |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7)              |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8)          |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9)      |     1
 SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) |     1
(10 rows)

postgres=#

Expected behavior

select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1; would return normalized query for query like IN (... [5-<some number> entries])

Actual result

select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1; returns 10 rows

@yahonda
Copy link
Author

yahonda commented Apr 4, 2024

$ bin/psql -d postgres
psql (17devel)
Type "help" for help.

postgres=# show pg_stat_statements.
pg_stat_statements.max                             pg_stat_statements.track
pg_stat_statements.query_id_const_merge_threshold  pg_stat_statements.track_planning
pg_stat_statements.save                            pg_stat_statements.track_utility
postgres=# show pg_stat_statements.query_id_const_merge_threshold
postgres-# ;
 pg_stat_statements.query_id_const_merge_threshold
---------------------------------------------------
 0
(1 row)

postgres=# set pg_stat_statements.query_id_const_merge_threshold = 5;
SET
postgres=# show pg_stat_statements.query_id_const_merge_threshold
;
 pg_stat_statements.query_id_const_merge_threshold
---------------------------------------------------
 5
(1 row)

postgres=#

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment