1) EXPLAIN ANALYZE - план и фактические строки. 2) Искать full scan - добавить индекс под WHERE/ORDER BY/JOIN. 3) Уменьшить выборку (нужные столбцы), убрать лишние JOIN. 4) Разбить запрос (CTE, батчи). 5) Обновить статистику (ANALYZE в Postgres). 6) В коде: пул соединений, таймауты, избегать N+1 (один запрос с IN или JOIN вместо цикла запросов).
// вместо N+1:
ids := extractIDs(users)
rows, _ := db.QueryContext(ctx, "SELECT * FROM orders WHERE user_id = ANY($1)", pq.Array(ids))