122 lines
4.5 KiB
PL/PgSQL
122 lines
4.5 KiB
PL/PgSQL
|
|
\set ON_ERROR_STOP on
|
||
|
|
\pset pager off
|
||
|
|
\pset format unaligned
|
||
|
|
\pset tuples_only on
|
||
|
|
|
||
|
|
-- Compare the endpoint's narrow page + independent count with a tempting
|
||
|
|
-- COUNT(*) OVER() fusion. The transaction/temp table leave no persistent
|
||
|
|
-- database state. This benchmark exists to reject the fusion if the window
|
||
|
|
-- forces PostgreSQL to materialise too much of a large directory.
|
||
|
|
BEGIN;
|
||
|
|
|
||
|
|
CREATE TEMP TABLE perf_admin_count (
|
||
|
|
id uuid NOT NULL,
|
||
|
|
username text,
|
||
|
|
email text NOT NULL,
|
||
|
|
role_text text NOT NULL,
|
||
|
|
storage_quota_bytes bigint NOT NULL,
|
||
|
|
storage_used_bytes bigint NOT NULL,
|
||
|
|
created_at timestamptz NOT NULL,
|
||
|
|
last_login_at timestamptz,
|
||
|
|
active boolean NOT NULL,
|
||
|
|
oidc_provider text,
|
||
|
|
is_external boolean NOT NULL
|
||
|
|
);
|
||
|
|
|
||
|
|
INSERT INTO perf_admin_count
|
||
|
|
SELECT
|
||
|
|
gen_random_uuid(),
|
||
|
|
'user-' || n,
|
||
|
|
'user-' || n || '@example.invalid',
|
||
|
|
CASE WHEN n % 20 = 0 THEN 'admin' ELSE 'user' END,
|
||
|
|
10737418240,
|
||
|
|
n::bigint * 1048576,
|
||
|
|
clock_timestamp() - make_interval(secs => n),
|
||
|
|
clock_timestamp() - make_interval(mins => n),
|
||
|
|
true,
|
||
|
|
CASE WHEN n % 3 = 0 THEN 'keycloak' END,
|
||
|
|
n % 7 = 0
|
||
|
|
FROM generate_series(1, 100000) AS n;
|
||
|
|
|
||
|
|
CREATE INDEX perf_admin_count_created_idx
|
||
|
|
ON perf_admin_count (created_at DESC);
|
||
|
|
ANALYZE perf_admin_count;
|
||
|
|
|
||
|
|
\o /dev/null
|
||
|
|
\timing on
|
||
|
|
|
||
|
|
-- A sample consists of these two statements; add their reported times.
|
||
|
|
\echo current_warmup_page
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes,
|
||
|
|
storage_used_bytes, last_login_at, active, oidc_provider, is_external
|
||
|
|
FROM perf_admin_count
|
||
|
|
ORDER BY created_at DESC LIMIT 100 OFFSET 0;
|
||
|
|
\echo current_warmup_count
|
||
|
|
SELECT COUNT(*) FROM perf_admin_count;
|
||
|
|
|
||
|
|
\echo candidate_warmup
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes,
|
||
|
|
storage_used_bytes, last_login_at, active, oidc_provider, is_external,
|
||
|
|
COUNT(*) OVER () AS total
|
||
|
|
FROM perf_admin_count
|
||
|
|
ORDER BY created_at DESC LIMIT 100 OFFSET 0;
|
||
|
|
|
||
|
|
\echo current_1_page
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
\echo current_1_count
|
||
|
|
SELECT COUNT(*) FROM perf_admin_count;
|
||
|
|
\echo candidate_1
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external, COUNT(*) OVER () AS total
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
|
||
|
|
\echo candidate_2
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external, COUNT(*) OVER () AS total
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
\echo current_2_page
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
\echo current_2_count
|
||
|
|
SELECT COUNT(*) FROM perf_admin_count;
|
||
|
|
|
||
|
|
\echo current_3_page
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
\echo current_3_count
|
||
|
|
SELECT COUNT(*) FROM perf_admin_count;
|
||
|
|
\echo candidate_3
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external, COUNT(*) OVER () AS total
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
|
||
|
|
\echo candidate_4
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external, COUNT(*) OVER () AS total
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
\echo current_4_page
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
\echo current_4_count
|
||
|
|
SELECT COUNT(*) FROM perf_admin_count;
|
||
|
|
|
||
|
|
\echo current_5_page
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
\echo current_5_count
|
||
|
|
SELECT COUNT(*) FROM perf_admin_count;
|
||
|
|
\echo candidate_5
|
||
|
|
SELECT id, username, email, role_text, storage_quota_bytes, storage_used_bytes,
|
||
|
|
last_login_at, active, oidc_provider, is_external, COUNT(*) OVER () AS total
|
||
|
|
FROM perf_admin_count ORDER BY created_at DESC LIMIT 100;
|
||
|
|
|
||
|
|
\timing off
|
||
|
|
\o
|
||
|
|
ROLLBACK;
|