On , I learnt ...

How to set per-role statement timeouts in Postgres

Postgres has a statement_timeout setting that will abort statements that run longer than the specified number of milliseconds.

This can be set globally in postgresql.conf but, perhaps more usefully, can be set on a per-role basis via:

=> ALTER ROLE webserver SET statement_timeout = '50s';

You can check what a role’s config is with e.g.

=> SELECT rolname, rolconfig FROM pg_roles WHERE rolname = 'webserver';
    rolname    |        rolconfig
---------------+-------------------------
 webserver     | {statement_timeout=50s}
 (1 row)

HTTP servers

If you’re using uWSGI, a useful pattern is to set a statement timeout slightly higher than your harakiri timeout value so long-running queries from HTTP servers will be aborted shortly after the uWSGI worker is killed.