[GH-ISSUE #3262] Connection pool exhaustion in 1.19.0/1.19.1 (ee-postgresql) #35771

Open
opened 2026-06-18 21:00:08 -05:00 by GiteaMirror · 16 comments
Owner

Originally created by @cendenta on GitHub (Jun 12, 2026).
Original GitHub issue: https://github.com/fosrl/pangolin/issues/3262

Originally assigned to: @oschwartz10612 on GitHub.

Summary

After updating the ee-postgresql image from 1.18.4 → 1.19.1, Pangolin became unable to acquire database connections within minutes of startup. Every query — both getResourceByDomain (per-request session verification) and getTraefikConfig (the Traefik config provider) — fails with timeout exceeded when trying to connect. This takes down all proxied resources at once.

The PostgreSQL server is healthy and idle (33/100 connections), yet Pangolin's pool holds ~20 connections that PostgreSQL reports as idle while Pangolin simultaneously reports it cannot obtain a connection. This is the signature of pooled clients being acquired but never released (or the event loop being starved), saturating the pool at its max.

A container restart restores service for a few minutes, then it re-degrades as the pool re-saturates. Downgrading to ee-postgresql-1.18.4 resolves it completely. 1.19.2 does not touch the relevant code and is also affected.

Logs

Both the per-request path and the config provider fail the same way:

[cause]: Error: timeout exceeded when trying to connect
    at async getResourceByDomain (server/db/queries/verifySessionQueries.ts:102:30)
    at async verifyResourceSession (server/routers/badger/verifySession.ts:156:28)

[cause]: Error: timeout exceeded when trying to connect
    at async getTraefikConfig (drizzle-orm/node-postgres/session.js:117)
    at async traefikConfigProvider

Evidence it is pool saturation, not the database

PostgreSQL is healthy and far from any limit, but Pangolin's connections are all parked idle while it still can't get one:

-- total connections vs limit (Postgres is fine)
 total | max
-------+-----
    33 | 100

-- pangolin DB: ~20 connections, effectively all idle, while every new query times out
 state  | count | oldest
--------+-------+----------
 active |     3 |
 idle   |    17 | 00:00:16

A request that does get a connection completes in ~67 ms, so the database and query are fast — the failure is purely connection acquisition. PostgreSQL's own log shows no too many clients/slot exhaustion.

Suspected cause

The regression window points squarely at the 1.19.0 "improve performance in hot paths / API endpoints with thousands of sites and users" rework:

  • Introduced in 1.19.0; 1.19.1 (hotfix) and 1.19.2 do not modify the DB session/query layer.
  • 1.18.4 is unaffected.

This suggests a code path in the reworked getResourceByDomain / Traefik config provider that checks out a pool client and does not release it on all branches (e.g., on early return or error), so the default pool (max ≈ 20) saturates. Pinning to 1.18.4 is a clean workaround.

Ask

Could you review connection acquire/release in the 1.19.0 hot-path changes — specifically whether pooled clients are released on every path (including error/early-return) in verifySessionQueries/the Traefik config provider — and whether a default pool max of ~20 is expected to be held indefinitely under normal traffic?

Happy to provide additional pg_stat_activity snapshots, full logs, or test a patched build.

Environment

  • OS Type & Version: Ubuntu 24.04.4 LTS (kernel 6.8.0-124-generic)
  • Pangolin Version: 1.19.1 (ee-postgresql) — bug present; also reproduces on 1.19.0; NOT present on 1.18.4
  • Edition: Enterprise (ee-postgresql image)
  • Gerbil Version: 1.4.1 (:latest)
  • Traefik Version: v3.6.10
  • Newt Version: 1.13.0 (:latest)
  • Client Version: N/A

To Reproduce

  1. Run ee-postgresql-1.19.1 against a PostgreSQL backend under normal traffic.
  2. Within a few minutes, all resources become unreachable and the logs fill with the error below.
  3. Restart the Pangolin container → service recovers briefly, then degrades again as the pool re-saturates.

Expected Behavior

  • Expected: each query checks out a pooled connection and returns it; steady-state pool stays well below max.
  • Actual: the pool grows to ~20 and stays there; every new acquisition times out.
Originally created by @cendenta on GitHub (Jun 12, 2026). Original GitHub issue: https://github.com/fosrl/pangolin/issues/3262 Originally assigned to: @oschwartz10612 on GitHub. **Summary** After updating the ee-postgresql image from 1.18.4 → 1.19.1, Pangolin became unable to acquire database connections within minutes of startup. Every query — both getResourceByDomain (per-request session verification) and getTraefikConfig (the Traefik config provider) — fails with timeout exceeded when trying to connect. This takes down all proxied resources at once. The PostgreSQL server is healthy and idle (33/100 connections), yet Pangolin's pool holds ~20 connections that PostgreSQL reports as idle while Pangolin simultaneously reports it cannot obtain a connection. This is the signature of pooled clients being acquired but never released (or the event loop being starved), saturating the pool at its max. A container restart restores service for a few minutes, then it re-degrades as the pool re-saturates. Downgrading to ee-postgresql-1.18.4 resolves it completely. 1.19.2 does not touch the relevant code and is also affected. **Logs** Both the per-request path and the config provider fail the same way: ``` [cause]: Error: timeout exceeded when trying to connect at async getResourceByDomain (server/db/queries/verifySessionQueries.ts:102:30) at async verifyResourceSession (server/routers/badger/verifySession.ts:156:28) [cause]: Error: timeout exceeded when trying to connect at async getTraefikConfig (drizzle-orm/node-postgres/session.js:117) at async traefikConfigProvider ``` **Evidence it is pool saturation, not the database** PostgreSQL is healthy and far from any limit, but Pangolin's connections are all parked idle while it still can't get one: ``` -- total connections vs limit (Postgres is fine) total | max -------+----- 33 | 100 -- pangolin DB: ~20 connections, effectively all idle, while every new query times out state | count | oldest --------+-------+---------- active | 3 | idle | 17 | 00:00:16 ``` A request that does get a connection completes in ~67 ms, so the database and query are fast — the failure is purely connection acquisition. PostgreSQL's own log shows no too many clients/slot exhaustion. **Suspected cause** The regression window points squarely at the 1.19.0 "improve performance in hot paths / API endpoints with thousands of sites and users" rework: - Introduced in 1.19.0; 1.19.1 (hotfix) and 1.19.2 do not modify the DB session/query layer. - 1.18.4 is unaffected. This suggests a code path in the reworked getResourceByDomain / Traefik config provider that checks out a pool client and does not release it on all branches (e.g., on early return or error), so the default pool (max ≈ 20) saturates. Pinning to 1.18.4 is a clean workaround. **Ask** Could you review connection acquire/release in the 1.19.0 hot-path changes — specifically whether pooled clients are released on every path (including error/early-return) in verifySessionQueries/the Traefik config provider — and whether a default pool max of ~20 is expected to be held indefinitely under normal traffic? Happy to provide additional pg_stat_activity snapshots, full logs, or test a patched build. ### Environment - OS Type & Version: Ubuntu 24.04.4 LTS (kernel 6.8.0-124-generic) - Pangolin Version: 1.19.1 (ee-postgresql) — bug present; also reproduces on 1.19.0; NOT present on 1.18.4 - Edition: Enterprise (ee-postgresql image) - Gerbil Version: 1.4.1 (:latest) - Traefik Version: v3.6.10 - Newt Version: 1.13.0 (:latest) - Client Version: N/A ### To Reproduce 1. Run ee-postgresql-1.19.1 against a PostgreSQL backend under normal traffic. 2. Within a few minutes, all resources become unreachable and the logs fill with the error below. 3. Restart the Pangolin container → service recovers briefly, then degrades again as the pool re-saturates. ### Expected Behavior - Expected: each query checks out a pooled connection and returns it; steady-state pool stays well below max. - Actual: the pool grows to ~20 and stays there; every new acquisition times out.
GiteaMirror added the potential bug label 2026-06-18 21:00:08 -05:00
Author
Owner

@oschwartz10612 commented on GitHub (Jun 12, 2026):

Hum on our cloud platform we are not experiencing this but something could be amiss. Could you try tweaking these values in your config and let me know if you are able to settle in a sweat spot? We are looking for query problems around the application but have not found a glaring issue yet. There were some updates done to the dependencies so perhaps there is something there as well.

postgres:
    pool:
        max_connections: 80
        max_replica_connections: 40
        idle_timeout_ms: 30000
        connection_timeout_ms: 10000
<!-- gh-comment-id:4696217713 --> @oschwartz10612 commented on GitHub (Jun 12, 2026): Hum on our cloud platform we are not experiencing this but something could be amiss. Could you try tweaking these values in your config and let me know if you are able to settle in a sweat spot? We are looking for query problems around the application but have not found a glaring issue yet. There were some updates done to the dependencies so perhaps there is something there as well. ``` postgres: pool: max_connections: 80 max_replica_connections: 40 idle_timeout_ms: 30000 connection_timeout_ms: 10000 ```
Author
Owner

@mprokopiev commented on GitHub (Jun 13, 2026):

Got the same timeouts right after upgrade to 1.19.1 (or at least I noticed that after upgrade to 1.19.1) on community edition. When idle - works fine. When accessing resources - they are very slow or failed. Log is full of postgres timeouts. Added pool config - slowness and exceptions are gone and solution works much smoother.

<!-- gh-comment-id:4698214787 --> @mprokopiev commented on GitHub (Jun 13, 2026): Got the same timeouts right after upgrade to 1.19.1 (or at least I noticed that after upgrade to 1.19.1) on community edition. When idle - works fine. When accessing resources - they are very slow or failed. Log is full of postgres timeouts. Added pool config - slowness and exceptions are gone and solution works much smoother.
Author
Owner

@Blacks-Army commented on GitHub (Jun 13, 2026):

I have the same experience

<!-- gh-comment-id:4699113711 --> @Blacks-Army commented on GitHub (Jun 13, 2026): I have the same experience
Author
Owner

@dx911xd commented on GitHub (Jun 13, 2026):

I have the same exp after upgrade from v1.18.4; high CPU usage observed with the app and postgresql containers. similar behavior also observed in 1.19.2 but resolved with manual db vaccum.

<!-- gh-comment-id:4699250417 --> @dx911xd commented on GitHub (Jun 13, 2026): I have the same exp after upgrade from v1.18.4; high CPU usage observed with the app and postgresql containers. similar behavior also observed in 1.19.2 but resolved with manual db vaccum.
Author
Owner

@oschwartz10612 commented on GitHub (Jun 13, 2026):

@Blacks-Army and @dx911xd could you try the same pool config above?

If that helps ease the issue then I will incorporate that as the
default. Perhaps the dependency changed some defaults or something that
is causing this.

<!-- gh-comment-id:4699261472 --> @oschwartz10612 commented on GitHub (Jun 13, 2026): @Blacks-Army and @dx911xd could you try the same pool config above? If that helps ease the issue then I will incorporate that as the default. Perhaps the dependency changed some defaults or something that is causing this.
Author
Owner

@mprokopiev commented on GitHub (Jun 13, 2026):

I am not sure if mine was actually the same pool exchaust as for the reporter but after some time with suggested pool config - the problem came back. Docker stats shows frequent spikes in CPU usage (>100%) most of the time. I downgraded back to 1.18.4. I'll monitor if the problem will came back.

<!-- gh-comment-id:4699269256 --> @mprokopiev commented on GitHub (Jun 13, 2026): I am not sure if mine was actually the same pool exchaust as for the reporter but after some time with suggested pool config - the problem came back. Docker stats shows frequent spikes in CPU usage (>100%) most of the time. I downgraded back to 1.18.4. I'll monitor if the problem will came back.
Author
Owner

@Blacks-Army commented on GitHub (Jun 13, 2026):

@oschwartz10612 the config did not help. But VACCUM did.

<!-- gh-comment-id:4699269542 --> @Blacks-Army commented on GitHub (Jun 13, 2026): @oschwartz10612 the config did not help. But VACCUM did.
Author
Owner

@mprokopiev commented on GitHub (Jun 14, 2026):

System works normally on 1.18.4. CPU usage is way lesser after downgrade and overall performance is better.

Image

Maybe some complex/heavy queries were added in 1.19.x? I see the most timed out quer in the log is this one (formatted):

Jun 12 11:28:22 edge.us.internal docker/pangolin[1406225]: Error: Failed query:
select 
  "resources"."resourceId", 
  "resources"."resourcePolicyId", 
  "resources"."defaultResourcePolicyId", 
  "resources"."resourceGuid", 
  "resources"."orgId", 
  "resources"."niceId", 
  "resources"."name", 
  "resources"."subdomain", 
  "resources"."fullDomain", 
  "resources"."domainId", 
  "resources"."ssl", 
  "resources"."blockAccess", 
  "resources"."proxyPort", 
  "resources"."sso", 
  "resources"."emailWhitelistEnabled", 
  "resources"."applyRules", 
  "resources"."enabled", 
  "resources"."stickySession", 
  "resources"."tlsServerName", 
  "resources"."setHostHeader", 
  "resources"."enableProxy", 
  "resources"."skipToIdpId", 
  "resources"."headers", 
  "resources"."proxyProtocol", 
  "resources"."proxyProtocolVersion", 
  "resources"."maintenanceModeEnabled", 
  "resources"."maintenanceModeType", 
  "resources"."maintenanceTitle", 
  "resources"."maintenanceMessage", 
  "resources"."maintenanceEstimatedTime", 
  "resources"."postAuthPath", 
  "resources"."health", 
  "resources"."wildcard", 
  "resources"."mode", 
  "resources"."pamMode", 
  "resources"."authDaemonMode", 
  "resources"."authDaemonPort", 
  "resourcePincode"."pincodeId", 
  "resourcePincode"."resourceId", 
  "resourcePincode"."pincodeHash", 
  "resourcePincode"."digitLength", 
  "resourcePassword"."passwordId", 
  "resourcePassword"."resourceId", 
  "resourcePassword"."passwordHash", 
  "resourceHeaderAuth"."headerAuthId", 
  "resourceHeaderAuth"."resourceId", 
  "resourceHeaderAuth"."headerAuthHash", 
  "resourceHeaderAuthExtendedCompatibility"."headerAuthExtendedCompatibilityId", 
  "resourceHeaderAuthExtendedCompatibility"."resourceId", 
  "resourceHeaderAuthExtendedCompatibility"."extendedCompatibilityIsActivated", 
  "sharedPolicy"."resourcePolicyId", 
  "sharedPolicy"."sso", 
  "sharedPolicy"."applyRules", 
  "sharedPolicy"."scope", 
  "sharedPolicy"."emailWhitelistEnabled", 
  "sharedPolicy"."idpId", 
  "sharedPolicy"."niceId", 
  "sharedPolicy"."name", 
  "sharedPolicy"."orgId", 
  "sharedPolicyPincode"."pincodeId", 
  "sharedPolicyPincode"."pincodeHash", 
  "sharedPolicyPincode"."digitLength", 
  "sharedPolicyPincode"."resourcePolicyId", 
  "sharedPolicyPassword"."passwordId", 
  "sharedPolicyPassword"."passwordHash", 
  "sharedPolicyPassword"."resourcePolicyId", 
  "sharedPolicyHeaderAuth"."headerAuthId", 
  "sharedPolicyHeaderAuth"."headerAuthHash", 
  "sharedPolicyHeaderAuth"."extendedCompatibility", 
  "sharedPolicyHeaderAuth"."resourcePolicyId", 
  "defaultPolicy"."resourcePolicyId", 
  "defaultPolicy"."sso", 
  "defaultPolicy"."applyRules", 
  "defaultPolicy"."scope", 
  "defaultPolicy"."emailWhitelistEnabled", 
  "defaultPolicy"."idpId", 
  "defaultPolicy"."niceId", 
  "defaultPolicy"."name", 
  "defaultPolicy"."orgId", 
  "defaultPolicyPincode"."pincodeId", 
  "defaultPolicyPincode"."pincodeHash", 
  "defaultPolicyPincode"."digitLength", 
  "defaultPolicyPincode"."resourcePolicyId", 
  "defaultPolicyPassword"."passwordId", 
  "defaultPolicyPassword"."passwordHash", 
  "defaultPolicyPassword"."resourcePolicyId", 
  "defaultPolicyHeaderAuth"."headerAuthId", 
  "defaultPolicyHeaderAuth"."headerAuthHash", 
  "defaultPolicyHeaderAuth"."extendedCompatibility", 
  "defaultPolicyHeaderAuth"."resourcePolicyId", 
  "orgs"."orgId", 
  "orgs"."name", 
  "orgs"."subnet", 
  "orgs"."utilitySubnet", 
  "orgs"."createdAt", 
  "orgs"."requireTwoFactor", 
  "orgs"."maxSessionLengthHours", 
  "orgs"."passwordExpiryDays", 
  "orgs"."settingsLogRetentionDaysRequest", 
  "orgs"."settingsLogRetentionDaysAccess", 
  "orgs"."settingsLogRetentionDaysAction", 
  "orgs"."settingsLogRetentionDaysConnection", 
  "orgs"."sshCaPrivateKey", 
  "orgs"."sshCaPublicKey", 
  "orgs"."isBillingOrg", 
  "orgs"."billingOrgId", 
  "orgs"."settingsEnableGlobalNewtAutoUpdate" 
from 
  "resources" 
  left join "resourcePincode" on "resourcePincode"."resourceId" = "resources"."resourceId" 
  left join "resourcePassword" on "resourcePassword"."resourceId" = "resources"."resourceId" 
  left join "resourceHeaderAuth" on "resourceHeaderAuth"."resourceId" = "resources"."resourceId" 
  left join "resourceHeaderAuthExtendedCompatibility" on "resourceHeaderAuthExtendedCompatibility"."resourceId" = "resources"."resourceId" 
  left join "resourcePolicies" "sharedPolicy" on "sharedPolicy"."resourcePolicyId" = "resources"."resourcePolicyId" 
  left join "resourcePolicyPincode" "sharedPolicyPincode" on "sharedPolicyPincode"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId" 
  left join "resourcePolicyPassword" "sharedPolicyPassword" on "sharedPolicyPassword"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId" 
  left join "resourcePolicyHeaderAuth" "sharedPolicyHeaderAuth" on "sharedPolicyHeaderAuth"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId" 
  left join "resourcePolicies" "defaultPolicy" on "defaultPolicy"."resourcePolicyId" = "resources"."defaultResourcePolicyId" 
  left join "resourcePolicyPincode" "defaultPolicyPincode" on "defaultPolicyPincode"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId" 
  left join "resourcePolicyPassword" "defaultPolicyPassword" on "defaultPolicyPassword"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId" 
  left join "resourcePolicyHeaderAuth" "defaultPolicyHeaderAuth" on "defaultPolicyHeaderAuth"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId" 
  inner join "orgs" on "orgs"."orgId" = "resources"."orgId" 
where 
  (
    "resources"."fullDomain" = $1 
    or (
      "resources"."wildcard" = $2 
      and "resources"."fullDomain" in ($3, $4, $5, $6)
    )
  )

I am on Racknerd VPS - 2CPU, 2GB RAM.

<!-- gh-comment-id:4701437191 --> @mprokopiev commented on GitHub (Jun 14, 2026): System works normally on 1.18.4. CPU usage is way lesser after downgrade and overall performance is better. <img width="701" height="454" alt="Image" src="https://github.com/user-attachments/assets/6e10e418-0b40-4848-a517-142ccb55f0c7" /> Maybe some complex/heavy queries were added in 1.19.x? I see the most timed out quer in the log is this one (formatted): ``` Jun 12 11:28:22 edge.us.internal docker/pangolin[1406225]: Error: Failed query: select "resources"."resourceId", "resources"."resourcePolicyId", "resources"."defaultResourcePolicyId", "resources"."resourceGuid", "resources"."orgId", "resources"."niceId", "resources"."name", "resources"."subdomain", "resources"."fullDomain", "resources"."domainId", "resources"."ssl", "resources"."blockAccess", "resources"."proxyPort", "resources"."sso", "resources"."emailWhitelistEnabled", "resources"."applyRules", "resources"."enabled", "resources"."stickySession", "resources"."tlsServerName", "resources"."setHostHeader", "resources"."enableProxy", "resources"."skipToIdpId", "resources"."headers", "resources"."proxyProtocol", "resources"."proxyProtocolVersion", "resources"."maintenanceModeEnabled", "resources"."maintenanceModeType", "resources"."maintenanceTitle", "resources"."maintenanceMessage", "resources"."maintenanceEstimatedTime", "resources"."postAuthPath", "resources"."health", "resources"."wildcard", "resources"."mode", "resources"."pamMode", "resources"."authDaemonMode", "resources"."authDaemonPort", "resourcePincode"."pincodeId", "resourcePincode"."resourceId", "resourcePincode"."pincodeHash", "resourcePincode"."digitLength", "resourcePassword"."passwordId", "resourcePassword"."resourceId", "resourcePassword"."passwordHash", "resourceHeaderAuth"."headerAuthId", "resourceHeaderAuth"."resourceId", "resourceHeaderAuth"."headerAuthHash", "resourceHeaderAuthExtendedCompatibility"."headerAuthExtendedCompatibilityId", "resourceHeaderAuthExtendedCompatibility"."resourceId", "resourceHeaderAuthExtendedCompatibility"."extendedCompatibilityIsActivated", "sharedPolicy"."resourcePolicyId", "sharedPolicy"."sso", "sharedPolicy"."applyRules", "sharedPolicy"."scope", "sharedPolicy"."emailWhitelistEnabled", "sharedPolicy"."idpId", "sharedPolicy"."niceId", "sharedPolicy"."name", "sharedPolicy"."orgId", "sharedPolicyPincode"."pincodeId", "sharedPolicyPincode"."pincodeHash", "sharedPolicyPincode"."digitLength", "sharedPolicyPincode"."resourcePolicyId", "sharedPolicyPassword"."passwordId", "sharedPolicyPassword"."passwordHash", "sharedPolicyPassword"."resourcePolicyId", "sharedPolicyHeaderAuth"."headerAuthId", "sharedPolicyHeaderAuth"."headerAuthHash", "sharedPolicyHeaderAuth"."extendedCompatibility", "sharedPolicyHeaderAuth"."resourcePolicyId", "defaultPolicy"."resourcePolicyId", "defaultPolicy"."sso", "defaultPolicy"."applyRules", "defaultPolicy"."scope", "defaultPolicy"."emailWhitelistEnabled", "defaultPolicy"."idpId", "defaultPolicy"."niceId", "defaultPolicy"."name", "defaultPolicy"."orgId", "defaultPolicyPincode"."pincodeId", "defaultPolicyPincode"."pincodeHash", "defaultPolicyPincode"."digitLength", "defaultPolicyPincode"."resourcePolicyId", "defaultPolicyPassword"."passwordId", "defaultPolicyPassword"."passwordHash", "defaultPolicyPassword"."resourcePolicyId", "defaultPolicyHeaderAuth"."headerAuthId", "defaultPolicyHeaderAuth"."headerAuthHash", "defaultPolicyHeaderAuth"."extendedCompatibility", "defaultPolicyHeaderAuth"."resourcePolicyId", "orgs"."orgId", "orgs"."name", "orgs"."subnet", "orgs"."utilitySubnet", "orgs"."createdAt", "orgs"."requireTwoFactor", "orgs"."maxSessionLengthHours", "orgs"."passwordExpiryDays", "orgs"."settingsLogRetentionDaysRequest", "orgs"."settingsLogRetentionDaysAccess", "orgs"."settingsLogRetentionDaysAction", "orgs"."settingsLogRetentionDaysConnection", "orgs"."sshCaPrivateKey", "orgs"."sshCaPublicKey", "orgs"."isBillingOrg", "orgs"."billingOrgId", "orgs"."settingsEnableGlobalNewtAutoUpdate" from "resources" left join "resourcePincode" on "resourcePincode"."resourceId" = "resources"."resourceId" left join "resourcePassword" on "resourcePassword"."resourceId" = "resources"."resourceId" left join "resourceHeaderAuth" on "resourceHeaderAuth"."resourceId" = "resources"."resourceId" left join "resourceHeaderAuthExtendedCompatibility" on "resourceHeaderAuthExtendedCompatibility"."resourceId" = "resources"."resourceId" left join "resourcePolicies" "sharedPolicy" on "sharedPolicy"."resourcePolicyId" = "resources"."resourcePolicyId" left join "resourcePolicyPincode" "sharedPolicyPincode" on "sharedPolicyPincode"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId" left join "resourcePolicyPassword" "sharedPolicyPassword" on "sharedPolicyPassword"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId" left join "resourcePolicyHeaderAuth" "sharedPolicyHeaderAuth" on "sharedPolicyHeaderAuth"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId" left join "resourcePolicies" "defaultPolicy" on "defaultPolicy"."resourcePolicyId" = "resources"."defaultResourcePolicyId" left join "resourcePolicyPincode" "defaultPolicyPincode" on "defaultPolicyPincode"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId" left join "resourcePolicyPassword" "defaultPolicyPassword" on "defaultPolicyPassword"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId" left join "resourcePolicyHeaderAuth" "defaultPolicyHeaderAuth" on "defaultPolicyHeaderAuth"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId" inner join "orgs" on "orgs"."orgId" = "resources"."orgId" where ( "resources"."fullDomain" = $1 or ( "resources"."wildcard" = $2 and "resources"."fullDomain" in ($3, $4, $5, $6) ) ) ``` I am on Racknerd VPS - 2CPU, 2GB RAM.
Author
Owner

@mprokopiev commented on GitHub (Jun 14, 2026):

A query plan for the reference:

QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Hash Left Join  (cost=832.36..4767371.34 rows=290134398 width=1364) (actual time=2251.489..2251.510 rows=1.00 loops=1)
   Hash Cond: (resources."defaultResourcePolicyId" = "defaultPolicy"."resourcePolicyId")
   Buffers: shared hit=13
   ->  Hash Left Join  (cost=492.67..1464538.89 rows=20053087 width=1100) (actual time=2251.299..2251.312 rows=1.00 loops=1)
         Hash Cond: ("sharedPolicy"."resourcePolicyId" = "sharedPolicyHeaderAuth"."resourcePolicyId")
         Buffers: shared hit=12
         ->  Hash Join  (cost=456.12..40393.27 rows=8157188 width=1059) (actual time=2251.268..2251.281 rows=1.00 loops=1)
               Hash Cond: ((resources."orgId")::text = (orgs."orgId")::text)
               Buffers: shared hit=12
               ->  Hash Left Join  (cost=440.27..18615.77 rows=8157188 width=776) (actual time=0.612..0.621 rows=1.00 loops=1)
                     Hash Cond: (resources."resourcePolicyId" = "sharedPolicy"."resourcePolicyId")
                     Buffers: shared hit=11
                     ->  Merge Right Join  (cost=289.50..4604.98 rows=1386000 width=553) (actual time=0.455..0.461 rows=1.00 loops=1)
                           Merge Cond: ("resourceHeaderAuth"."resourceId" = resources."resourceId")
                           Buffers: shared hit=10
                           ->  Sort  (cost=83.37..86.37 rows=1200 width=40) (actual time=0.259..0.260 rows=0.00 loops=1)
                                 Sort Key: "resourceHeaderAuth"."resourceId"
                                 Sort Method: quicksort  Memory: 25kB
                                 Buffers: shared hit=5
                                 ->  Seq Scan on "resourceHeaderAuth"  (cost=0.00..22.00 rows=1200 width=40) (actual time=0.078..0.079 rows=0.00 loops=1)
                                       Buffers: shared hit=1
                           ->  Materialize  (cost=206.13..473.11 rows=46200 width=513) (actual time=0.183..0.187 rows=1.00 loops=1)
                                 Storage: Memory  Maximum Storage: 17kB
                                 Buffers: shared hit=5
                                 ->  Merge Left Join  (cost=206.13..357.61 rows=46200 width=513) (actual time=0.171..0.175 rows=1.00 loops=1)
                                       Merge Cond: (resources."resourceId" = "resourcePassword"."resourceId")
                                       Buffers: shared hit=5
                                       ->  Merge Left Join  (cost=122.75..131.79 rows=1540 width=473) (actual time=0.143..0.146 rows=1.00 loops=1)
                                             Merge Cond: (resources."resourceId" = "resourcePincode"."resourceId")
                                             Buffers: shared hit=5
                                             ->  Sort  (cost=44.15..44.29 rows=55 width=429) (actual time=0.111..0.113 rows=1.00 loops=1)
                                                   Sort Key: resources."resourceId"
                                                   Sort Method: quicksort  Memory: 25kB
                                                   Buffers: shared hit=5
                                                   ->  Hash Right Join  (cost=4.66..42.56 rows=55 width=429) (actual time=0.100..0.104 rows=1.00 loops=1)
                                                         Hash Cond: ("resourceHeaderAuthExtendedCompatibility"."resourceId" = resources."resourceId")
                                                         Buffers: shared hit=5
                                                         ->  Seq Scan on "resourceHeaderAuthExtendedCompatibility"  (cost=0.00..32.00 rows=2200 width=9) (actual time=0.018..0.019 rows=0.00 loops=1)
                                                               Buffers: shared hit=1
                                                         ->  Hash  (cost=4.65..4.65 rows=1 width=420) (actual time=0.071..0.071 rows=1.00 loops=1)
                                                               Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                                               Buffers: shared hit=4
                                                               ->  Seq Scan on resources  (cost=0.00..4.65 rows=1 width=420) (actual time=0.051..0.057 rows=1.00 loops=1)
                                                                     Filter: ((("fullDomain")::text = 'metrics.tldr.ua'::text) OR (wildcard AND (("fullDomain")::text = ANY ('{*.tldr.in.ua,*.in.ua,*.ua}'::text[]))))
                                                                     Rows Removed by Filter: 39
                                                                     Buffers: shared hit=4
                                             ->  Sort  (cost=78.60..81.43 rows=1130 width=44) (actual time=0.017..0.017 rows=0.00 loops=1)
                                                   Sort Key: "resourcePincode"."resourceId"
                                                   Sort Method: quicksort  Memory: 25kB
                                                   ->  Seq Scan on "resourcePincode"  (cost=0.00..21.30 rows=1130 width=44) (actual time=0.010..0.010 rows=0.00 loops=1)
                                       ->  Sort  (cost=83.37..86.37 rows=1200 width=40) (actual time=0.016..0.017 rows=0.00 loops=1)
                                             Sort Key: "resourcePassword"."resourceId"
                                             Sort Method: quicksort  Memory: 25kB
                                             ->  Seq Scan on "resourcePassword"  (cost=0.00..22.00 rows=1200 width=40) (actual time=0.009..0.009 rows=0.00 loops=1)
                     ->  Hash  (cost=115.46..115.46 rows=2825 width=223) (actual time=0.127..0.129 rows=40.00 loops=1)
                           Buckets: 4096  Batches: 1  Memory Usage: 38kB
                           Buffers: shared hit=1
                           ->  Hash Right Join  (cost=59.21..115.46 rows=2825 width=223) (actual time=0.102..0.112 rows=40.00 loops=1)
                                 Hash Cond: ("sharedPolicyPassword"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId")
                                 Buffers: shared hit=1
                                 ->  Seq Scan on "resourcePolicyPassword" "sharedPolicyPassword"  (cost=0.00..22.00 rows=1200 width=40) (actual time=0.012..0.012 rows=0.00 loops=1)
                                 ->  Hash  (cost=45.09..45.09 rows=1130 width=183) (actual time=0.077..0.078 rows=40.00 loops=1)
                                       Buckets: 2048  Batches: 1  Memory Usage: 22kB
                                       Buffers: shared hit=1
                                       ->  Hash Right Join  (cost=20.80..45.09 rows=1130 width=183) (actual time=0.054..0.062 rows=40.00 loops=1)
                                             Hash Cond: ("sharedPolicyPincode"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId")
                                             Buffers: shared hit=1
                                             ->  Seq Scan on "resourcePolicyPincode" "sharedPolicyPincode"  (cost=0.00..21.30 rows=1130 width=44) (actual time=0.010..0.010 rows=0.00 loops=1)
                                             ->  Hash  (cost=14.80..14.80 rows=480 width=139) (actual time=0.032..0.032 rows=40.00 loops=1)
                                                   Buckets: 1024  Batches: 1  Memory Usage: 14kB
                                                   Buffers: shared hit=1
                                                   ->  Seq Scan on "resourcePolicies" "sharedPolicy"  (cost=0.00..14.80 rows=480 width=139) (actual time=0.018..0.021 rows=40.00 loops=1)
                                                         Buffers: shared hit=1
               ->  Hash  (cost=12.60..12.60 rows=260 width=283) (actual time=2250.611..2250.615 rows=3.00 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 10kB
                     Buffers: shared hit=1
                     ->  Seq Scan on orgs  (cost=0.00..12.60 rows=260 width=283) (actual time=2250.516..2250.534 rows=3.00 loops=1)
                           Buffers: shared hit=1
         ->  Hash  (cost=21.80..21.80 rows=1180 width=41) (actual time=0.014..0.014 rows=0.00 loops=1)
               Buckets: 2048  Batches: 1  Memory Usage: 16kB
               ->  Seq Scan on "resourcePolicyHeaderAuth" "sharedPolicyHeaderAuth"  (cost=0.00..21.80 rows=1180 width=41) (actual time=0.014..0.014 rows=0.00 loops=1)
   ->  Hash  (cost=252.87..252.87 rows=6945 width=264) (actual time=0.165..0.169 rows=40.00 loops=1)
         Buckets: 8192  Batches: 1  Memory Usage: 70kB
         Buffers: shared hit=1
         ->  Hash Right Join  (cost=149.42..252.87 rows=6945 width=264) (actual time=0.131..0.149 rows=40.00 loops=1)
               Hash Cond: ("defaultPolicyPassword"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId")
               Buffers: shared hit=1
               ->  Seq Scan on "resourcePolicyPassword" "defaultPolicyPassword"  (cost=0.00..22.00 rows=1200 width=40) (actual time=0.009..0.009 rows=0.00 loops=1)
               ->  Hash  (cost=114.69..114.69 rows=2778 width=224) (actual time=0.110..0.114 rows=40.00 loops=1)
                     Buckets: 4096  Batches: 1  Memory Usage: 38kB
                     Buffers: shared hit=1
                     ->  Hash Right Join  (cost=59.21..114.69 rows=2778 width=224) (actual time=0.085..0.098 rows=40.00 loops=1)
                           Hash Cond: ("defaultPolicyHeaderAuth"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId")
                           Buffers: shared hit=1
                           ->  Seq Scan on "resourcePolicyHeaderAuth" "defaultPolicyHeaderAuth"  (cost=0.00..21.80 rows=1180 width=41) (actual time=0.014..0.017 rows=0.00 loops=1)
                           ->  Hash  (cost=45.09..45.09 rows=1130 width=183) (actual time=0.062..0.063 rows=40.00 loops=1)
                                 Buckets: 2048  Batches: 1  Memory Usage: 22kB
                                 Buffers: shared hit=1
                                 ->  Hash Right Join  (cost=20.80..45.09 rows=1130 width=183) (actual time=0.039..0.047 rows=40.00 loops=1)
                                       Hash Cond: ("defaultPolicyPincode"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId")
                                       Buffers: shared hit=1
                                       ->  Seq Scan on "resourcePolicyPincode" "defaultPolicyPincode"  (cost=0.00..21.30 rows=1130 width=44) (actual time=0.002..0.002 rows=0.00 loops=1)
                                       ->  Hash  (cost=14.80..14.80 rows=480 width=139) (actual time=0.028..0.029 rows=40.00 loops=1)
                                             Buckets: 1024  Batches: 1  Memory Usage: 14kB
                                             Buffers: shared hit=1
                                             ->  Seq Scan on "resourcePolicies" "defaultPolicy"  (cost=0.00..14.80 rows=480 width=139) (actual time=0.008..0.012 rows=40.00 loops=1)
                                                   Buffers: shared hit=1
 Planning:
   Buffers: shared hit=661
 Planning Time: 6.366 ms
 JIT:
   Functions: 106
   Options: Inlining true, Optimization true, Expressions true, Deforming true
   Timing: Generation 16.113 ms (Deform 9.711 ms), Inlining 120.649 ms, Optimization 1252.300 ms, Emission 877.604 ms, Total 2266.666 ms
 Execution Time: 2306.325 ms
(115 rows)

Rarely plan execition time was ~5s. If this is running very often - I guess it could overload DB quickly.

<!-- gh-comment-id:4701526175 --> @mprokopiev commented on GitHub (Jun 14, 2026): A query plan for the reference: ``` QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Hash Left Join (cost=832.36..4767371.34 rows=290134398 width=1364) (actual time=2251.489..2251.510 rows=1.00 loops=1) Hash Cond: (resources."defaultResourcePolicyId" = "defaultPolicy"."resourcePolicyId") Buffers: shared hit=13 -> Hash Left Join (cost=492.67..1464538.89 rows=20053087 width=1100) (actual time=2251.299..2251.312 rows=1.00 loops=1) Hash Cond: ("sharedPolicy"."resourcePolicyId" = "sharedPolicyHeaderAuth"."resourcePolicyId") Buffers: shared hit=12 -> Hash Join (cost=456.12..40393.27 rows=8157188 width=1059) (actual time=2251.268..2251.281 rows=1.00 loops=1) Hash Cond: ((resources."orgId")::text = (orgs."orgId")::text) Buffers: shared hit=12 -> Hash Left Join (cost=440.27..18615.77 rows=8157188 width=776) (actual time=0.612..0.621 rows=1.00 loops=1) Hash Cond: (resources."resourcePolicyId" = "sharedPolicy"."resourcePolicyId") Buffers: shared hit=11 -> Merge Right Join (cost=289.50..4604.98 rows=1386000 width=553) (actual time=0.455..0.461 rows=1.00 loops=1) Merge Cond: ("resourceHeaderAuth"."resourceId" = resources."resourceId") Buffers: shared hit=10 -> Sort (cost=83.37..86.37 rows=1200 width=40) (actual time=0.259..0.260 rows=0.00 loops=1) Sort Key: "resourceHeaderAuth"."resourceId" Sort Method: quicksort Memory: 25kB Buffers: shared hit=5 -> Seq Scan on "resourceHeaderAuth" (cost=0.00..22.00 rows=1200 width=40) (actual time=0.078..0.079 rows=0.00 loops=1) Buffers: shared hit=1 -> Materialize (cost=206.13..473.11 rows=46200 width=513) (actual time=0.183..0.187 rows=1.00 loops=1) Storage: Memory Maximum Storage: 17kB Buffers: shared hit=5 -> Merge Left Join (cost=206.13..357.61 rows=46200 width=513) (actual time=0.171..0.175 rows=1.00 loops=1) Merge Cond: (resources."resourceId" = "resourcePassword"."resourceId") Buffers: shared hit=5 -> Merge Left Join (cost=122.75..131.79 rows=1540 width=473) (actual time=0.143..0.146 rows=1.00 loops=1) Merge Cond: (resources."resourceId" = "resourcePincode"."resourceId") Buffers: shared hit=5 -> Sort (cost=44.15..44.29 rows=55 width=429) (actual time=0.111..0.113 rows=1.00 loops=1) Sort Key: resources."resourceId" Sort Method: quicksort Memory: 25kB Buffers: shared hit=5 -> Hash Right Join (cost=4.66..42.56 rows=55 width=429) (actual time=0.100..0.104 rows=1.00 loops=1) Hash Cond: ("resourceHeaderAuthExtendedCompatibility"."resourceId" = resources."resourceId") Buffers: shared hit=5 -> Seq Scan on "resourceHeaderAuthExtendedCompatibility" (cost=0.00..32.00 rows=2200 width=9) (actual time=0.018..0.019 rows=0.00 loops=1) Buffers: shared hit=1 -> Hash (cost=4.65..4.65 rows=1 width=420) (actual time=0.071..0.071 rows=1.00 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 9kB Buffers: shared hit=4 -> Seq Scan on resources (cost=0.00..4.65 rows=1 width=420) (actual time=0.051..0.057 rows=1.00 loops=1) Filter: ((("fullDomain")::text = 'metrics.tldr.ua'::text) OR (wildcard AND (("fullDomain")::text = ANY ('{*.tldr.in.ua,*.in.ua,*.ua}'::text[])))) Rows Removed by Filter: 39 Buffers: shared hit=4 -> Sort (cost=78.60..81.43 rows=1130 width=44) (actual time=0.017..0.017 rows=0.00 loops=1) Sort Key: "resourcePincode"."resourceId" Sort Method: quicksort Memory: 25kB -> Seq Scan on "resourcePincode" (cost=0.00..21.30 rows=1130 width=44) (actual time=0.010..0.010 rows=0.00 loops=1) -> Sort (cost=83.37..86.37 rows=1200 width=40) (actual time=0.016..0.017 rows=0.00 loops=1) Sort Key: "resourcePassword"."resourceId" Sort Method: quicksort Memory: 25kB -> Seq Scan on "resourcePassword" (cost=0.00..22.00 rows=1200 width=40) (actual time=0.009..0.009 rows=0.00 loops=1) -> Hash (cost=115.46..115.46 rows=2825 width=223) (actual time=0.127..0.129 rows=40.00 loops=1) Buckets: 4096 Batches: 1 Memory Usage: 38kB Buffers: shared hit=1 -> Hash Right Join (cost=59.21..115.46 rows=2825 width=223) (actual time=0.102..0.112 rows=40.00 loops=1) Hash Cond: ("sharedPolicyPassword"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId") Buffers: shared hit=1 -> Seq Scan on "resourcePolicyPassword" "sharedPolicyPassword" (cost=0.00..22.00 rows=1200 width=40) (actual time=0.012..0.012 rows=0.00 loops=1) -> Hash (cost=45.09..45.09 rows=1130 width=183) (actual time=0.077..0.078 rows=40.00 loops=1) Buckets: 2048 Batches: 1 Memory Usage: 22kB Buffers: shared hit=1 -> Hash Right Join (cost=20.80..45.09 rows=1130 width=183) (actual time=0.054..0.062 rows=40.00 loops=1) Hash Cond: ("sharedPolicyPincode"."resourcePolicyId" = "sharedPolicy"."resourcePolicyId") Buffers: shared hit=1 -> Seq Scan on "resourcePolicyPincode" "sharedPolicyPincode" (cost=0.00..21.30 rows=1130 width=44) (actual time=0.010..0.010 rows=0.00 loops=1) -> Hash (cost=14.80..14.80 rows=480 width=139) (actual time=0.032..0.032 rows=40.00 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 14kB Buffers: shared hit=1 -> Seq Scan on "resourcePolicies" "sharedPolicy" (cost=0.00..14.80 rows=480 width=139) (actual time=0.018..0.021 rows=40.00 loops=1) Buffers: shared hit=1 -> Hash (cost=12.60..12.60 rows=260 width=283) (actual time=2250.611..2250.615 rows=3.00 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 10kB Buffers: shared hit=1 -> Seq Scan on orgs (cost=0.00..12.60 rows=260 width=283) (actual time=2250.516..2250.534 rows=3.00 loops=1) Buffers: shared hit=1 -> Hash (cost=21.80..21.80 rows=1180 width=41) (actual time=0.014..0.014 rows=0.00 loops=1) Buckets: 2048 Batches: 1 Memory Usage: 16kB -> Seq Scan on "resourcePolicyHeaderAuth" "sharedPolicyHeaderAuth" (cost=0.00..21.80 rows=1180 width=41) (actual time=0.014..0.014 rows=0.00 loops=1) -> Hash (cost=252.87..252.87 rows=6945 width=264) (actual time=0.165..0.169 rows=40.00 loops=1) Buckets: 8192 Batches: 1 Memory Usage: 70kB Buffers: shared hit=1 -> Hash Right Join (cost=149.42..252.87 rows=6945 width=264) (actual time=0.131..0.149 rows=40.00 loops=1) Hash Cond: ("defaultPolicyPassword"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId") Buffers: shared hit=1 -> Seq Scan on "resourcePolicyPassword" "defaultPolicyPassword" (cost=0.00..22.00 rows=1200 width=40) (actual time=0.009..0.009 rows=0.00 loops=1) -> Hash (cost=114.69..114.69 rows=2778 width=224) (actual time=0.110..0.114 rows=40.00 loops=1) Buckets: 4096 Batches: 1 Memory Usage: 38kB Buffers: shared hit=1 -> Hash Right Join (cost=59.21..114.69 rows=2778 width=224) (actual time=0.085..0.098 rows=40.00 loops=1) Hash Cond: ("defaultPolicyHeaderAuth"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId") Buffers: shared hit=1 -> Seq Scan on "resourcePolicyHeaderAuth" "defaultPolicyHeaderAuth" (cost=0.00..21.80 rows=1180 width=41) (actual time=0.014..0.017 rows=0.00 loops=1) -> Hash (cost=45.09..45.09 rows=1130 width=183) (actual time=0.062..0.063 rows=40.00 loops=1) Buckets: 2048 Batches: 1 Memory Usage: 22kB Buffers: shared hit=1 -> Hash Right Join (cost=20.80..45.09 rows=1130 width=183) (actual time=0.039..0.047 rows=40.00 loops=1) Hash Cond: ("defaultPolicyPincode"."resourcePolicyId" = "defaultPolicy"."resourcePolicyId") Buffers: shared hit=1 -> Seq Scan on "resourcePolicyPincode" "defaultPolicyPincode" (cost=0.00..21.30 rows=1130 width=44) (actual time=0.002..0.002 rows=0.00 loops=1) -> Hash (cost=14.80..14.80 rows=480 width=139) (actual time=0.028..0.029 rows=40.00 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 14kB Buffers: shared hit=1 -> Seq Scan on "resourcePolicies" "defaultPolicy" (cost=0.00..14.80 rows=480 width=139) (actual time=0.008..0.012 rows=40.00 loops=1) Buffers: shared hit=1 Planning: Buffers: shared hit=661 Planning Time: 6.366 ms JIT: Functions: 106 Options: Inlining true, Optimization true, Expressions true, Deforming true Timing: Generation 16.113 ms (Deform 9.711 ms), Inlining 120.649 ms, Optimization 1252.300 ms, Emission 877.604 ms, Total 2266.666 ms Execution Time: 2306.325 ms (115 rows) ``` Rarely plan execition time was ~5s. If this is running very often - I guess it could overload DB quickly.
Author
Owner

@ex-aequo-et-bono commented on GitHub (Jun 14, 2026):

Confirming VACUUM worked to fix this problem for me. CE Postgres version.

<!-- gh-comment-id:4702160652 --> @ex-aequo-et-bono commented on GitHub (Jun 14, 2026): Confirming VACUUM worked to fix this problem for me. CE Postgres version.
Author
Owner

@AstralDestiny commented on GitHub (Jun 14, 2026):

What's Vacuum sorry?

<!-- gh-comment-id:4702339424 --> @AstralDestiny commented on GitHub (Jun 14, 2026): What's Vacuum sorry?
Author
Owner

@ex-aequo-et-bono commented on GitHub (Jun 14, 2026):

It's a postgres command to reclaim dead tuples.

docker exec -it <container_name> psql -U <username> -d <database_name> -c "VACUUM ANALYZE;"

<!-- gh-comment-id:4702349286 --> @ex-aequo-et-bono commented on GitHub (Jun 14, 2026): It's a postgres command to reclaim dead tuples. ```docker exec -it <container_name> psql -U <username> -d <database_name> -c "VACUUM ANALYZE;" ```
Author
Owner

@ooCloudXoo commented on GitHub (Jun 15, 2026):

I have the same experience

Same here

<!-- gh-comment-id:4705160408 --> @ooCloudXoo commented on GitHub (Jun 15, 2026): > I have the same experience Same here
Author
Owner

@mprokopiev commented on GitHub (Jun 15, 2026):

Upgraded. Vacuum helped too. Same query execution time now took lesser than second.

<!-- gh-comment-id:4710547972 --> @mprokopiev commented on GitHub (Jun 15, 2026): Upgraded. Vacuum helped too. Same query execution time now took lesser than second.
Author
Owner

@ooCloudXoo commented on GitHub (Jun 16, 2026):

Upgraded. Vacuum helped too. Same query execution time now took lesser than second.

This also worked for me

<!-- gh-comment-id:4716593325 --> @ooCloudXoo commented on GitHub (Jun 16, 2026): > Upgraded. Vacuum helped too. Same query execution time now took lesser than second. This also worked for me
Author
Owner

@Hutch79 commented on GitHub (Jun 16, 2026):

Had the same problem and VACUUM ANALYZE; fixed it for me. Although I guess this is only a temporary fix since the DB will get fragmented again.

Thx for the workaround!!! 💜

<!-- gh-comment-id:4719163165 --> @Hutch79 commented on GitHub (Jun 16, 2026): Had the same problem and `VACUUM ANALYZE;` _fixed_ it for me. Although I guess this is only a temporary fix since the DB will get fragmented again. Thx for the workaround!!! 💜
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/pangolin#35771