postgres icon indicating copy to clipboard operation
postgres copied to clipboard

Transactions repeatedly query all types, causing significant delays.

Open Imran-imtiaz48 opened this issue 1 year ago • 2 comments

The delays we're experiencing in certain transactions are due to the 'fetch types' functionality, which runs the following query:

select b.oid, b.typarray 
from pg_catalog.pg_type a 
left join pg_catalog.pg_type b on b.oid = a.typelem 
where a.typcategory = 'A' 
group by b.oid, b.typarray 
order by b.oid;

Each transaction re-executes this query, and when we tried disabling it, we encountered the following error: PostgresError: malformed array literal: "". The delay caused by this query is over 200ms on our side.

Is there any way we can mitigate this delay without triggering errors?

Imran-imtiaz48 avatar Sep 24 '24 04:09 Imran-imtiaz48

Yea, I've made an issue about this some time ago. It shouldn't run on each transaction, but on each unused connection it picks from the pool. The solution I made for this, was to "prepare" all the connections in the pool. As in, using each one to perform a quick query so that all of them fetch the types.

It's a workaround, but works and performs in less than half a second, if you use them all at once. You can also make your own fork of postgres.js and cache the types in https://github.com/porsager/postgres/blob/master/src/connection.js#L742

phosmium avatar Oct 29 '24 05:10 phosmium

@phosmium fwiw would be great if you could post a PR that caches the types (assuming you've implemented your suggestion of caching); I would selfishly like to copy/paste it. :-D

stephenh avatar May 01 '25 04:05 stephenh