PostgreSQL Cheatsheet

psql meta-commands + Postgres-specific SQL you'll reach for daily.

1 credit

psql meta-commands

9 items
Connect
psql -h host -U user -d db
List DBs
\l
List tables
\dt
Describe table
\d+ users
List roles
\du
Show schemas
\dn
Timing queries
\timing
Read SQL file
\i schema.sql
Quit
\q

Types / features

5 items
JSONB column
CREATE TABLE x (meta JSONB) / meta->>'key' / meta @> '{"k":1}'
Array
tags TEXT[] / WHERE 'admin' = ANY(roles)
UUID default
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
Enums
CREATE TYPE status AS ENUM ('new','done')
Generated column
full_name TEXT GENERATED ALWAYS AS (first||' '||last) STORED

Indexing

5 items
Standard B-tree
CREATE INDEX idx_users_email ON users(email);
Partial
CREATE INDEX ... ON orders(user_id) WHERE status='open';
Expression
CREATE INDEX ... ON users(lower(email));
JSONB path (GIN)
CREATE INDEX ... ON docs USING gin(meta);
Inspect usage
SELECT * FROM pg_stat_user_indexes WHERE idx_scan = 0; -- unused

Performance

5 items
Plan + timings
EXPLAIN ANALYZE SELECT ...;
Long-running queries
SELECT pid, now()-query_start AS age, query FROM pg_stat_activity WHERE state='active' ORDER BY age DESC;
Table sizes
SELECT pg_size_pretty(pg_total_relation_size('orders'));
Kill query
SELECT pg_cancel_backend(<pid>); -- gentler; pg_terminate_backend for force
Vacuum + analyze
VACUUM ANALYZE orders;

Further reading