PgHero
No long running queries
Connections healthy 53
Vacuuming healthy
No columns near integer overflow (3 unreadable sequences)
No invalid indexes or constraints
1 duplicate index
2 suggested indexes
16 slow queries

Unreadable Sequences

This is likely due to missing privileges. Make sure your user has the SELECT privilege for each sequence.

Column Sequence
subscription.id Unable to parse: nextval((pg_get_serial_sequence('public.subscription'::text, 'id'::text))::regclass)
configuration.id Unable to parse: nextval((pg_get_serial_sequence('public.configuration'::text, 'id'::text))::regclass)
singlepayment.id Unable to parse: nextval((pg_get_serial_sequence('public.singlepayment'::text, 'id'::text))::regclass)

Duplicate Indexes

These indexes exist, but aren’t needed. Remove them for faster writes.

rails generate migration remove_unneeded_indexes

And paste

remove_index :upload, name: "upload_task_id_idx1", column: :task_id
Details
On upload
upload_task_id_idx1 (task_id)
is covered by
upload_task_id_idx (task_id)

Suggested Indexes

Add indexes to speed up queries.

rails generate migration add_suggested_indexes

And paste

commit_db_transaction
add_index :configuration, [:user_id], algorithm: :concurrently
add_index :upload, [:created_at], algorithm: :concurrently

Details
CREATE INDEX CONCURRENTLY ON configuration (user_id)
Rows: 99783
Row progression: 99783, 2

Row estimates
- user_id (=): 2

Existing indexes
- id PRIMARY

to speed up

Total Time Average Time Calls
0 min < 0.1% 60 ms 112 postgres
SELECT "upload_type","name","description","user_id","id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 109 postgres
SELECT "upload_type","user_id","id","description","settings","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 110 postgres
SELECT "settings","user_id","id","name","description","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 103 postgres
SELECT "name","user_id","settings","upload_type","id","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 102 postgres
SELECT "description","id","name","user_id","upload_type","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 101 postgres
SELECT "upload_type","settings","user_id","id","description","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 98 postgres
SELECT "name","description","settings","id","user_id","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 96 postgres
SELECT "name","description","user_id","settings","id","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 97 postgres
SELECT "description","id","upload_type","user_id","settings","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 96 postgres
SELECT "user_id","settings","id","name","upload_type","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 63 ms 90 postgres
SELECT "name","settings","user_id","description","id","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 96 postgres
SELECT "id","upload_type","settings","description","user_id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 94 postgres
SELECT "description","settings","name","upload_type","user_id","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 91 postgres
SELECT "settings","id","name","upload_type","description","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 92 postgres
SELECT "name","description","id","settings","user_id","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 92 postgres
SELECT "upload_type","name","user_id","description","settings","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 93 postgres
SELECT "upload_type","settings","name","description","user_id","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 89 postgres
SELECT "name","id","settings","upload_type","description","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 87 postgres
SELECT "id","upload_type","name","description","user_id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 88 postgres
SELECT "description","name","id","upload_type","settings","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 57 ms 92 postgres
SELECT "user_id","name","settings","id","upload_type","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 88 postgres
SELECT "settings","upload_type","description","name","user_id","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 86 postgres
SELECT "settings","user_id","description","name","upload_type","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 88 postgres
SELECT "id","user_id","description","upload_type","settings","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 89 postgres
SELECT "id","upload_type","description","user_id","name","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 86 postgres
SELECT "id","settings","name","description","upload_type","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 86 postgres
SELECT "upload_type","id","name","description","user_id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 85 postgres
SELECT "description","id","settings","upload_type","user_id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 84 postgres
SELECT "upload_type","settings","user_id","name","id","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 87 postgres
SELECT "name","settings","upload_type","user_id","id","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 84 postgres
SELECT "description","upload_type","id","name","user_id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 84 postgres
SELECT "upload_type","id","settings","name","description","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 62 ms 81 postgres
SELECT "name","user_id","upload_type","settings","id","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 83 postgres
SELECT "settings","upload_type","user_id","name","description","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 83 postgres
SELECT "id","settings","upload_type","description","user_id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 86 postgres
SELECT "settings","name","description","id","user_id","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 81 postgres
SELECT "user_id","description","upload_type","id","name","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 63 ms 78 postgres
SELECT "description","name","id","settings","user_id","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 80 postgres
SELECT "name","settings","description","upload_type","id","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 80 postgres
SELECT "id","description","name","upload_type","settings","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 81 postgres
SELECT "id","description","user_id","settings","name","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 82 postgres
SELECT "upload_type","settings","user_id","description","name","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 82 postgres
SELECT "description","upload_type","id","settings","user_id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 79 postgres
SELECT "description","user_id","upload_type","name","id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 78 postgres
SELECT "user_id","settings","name","id","description","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 80 postgres
SELECT "description","user_id","name","id","settings","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 78 postgres
SELECT "name","id","user_id","upload_type","description","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 80 postgres
SELECT "settings","name","upload_type","id","user_id","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 78 postgres
SELECT "upload_type","settings","id","description","user_id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 77 postgres
SELECT "upload_type","description","settings","name","user_id","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 80 postgres
SELECT "description","settings","user_id","upload_type","name","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 79 postgres
SELECT "id","name","upload_type","user_id","settings","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 79 postgres
SELECT "settings","upload_type","description","id","user_id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 76 postgres
SELECT "id","settings","description","user_id","name","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 76 postgres
SELECT "settings","name","description","id","upload_type","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 75 postgres
SELECT "settings","id","description","name","upload_type","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 63 ms 72 postgres
SELECT "description","id","name","settings","user_id","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 74 postgres
SELECT "upload_type","user_id","name","description","settings","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 76 postgres
SELECT "id","user_id","settings","description","name","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 74 postgres
SELECT "upload_type","id","settings","name","user_id","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 76 postgres
SELECT "user_id","upload_type","name","settings","id","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 74 postgres
SELECT "description","name","id","upload_type","user_id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 73 postgres
SELECT "user_id","upload_type","description","settings","id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 72 postgres
SELECT "description","id","name","upload_type","settings","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 73 postgres
SELECT "name","id","upload_type","description","user_id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 72 postgres
SELECT "user_id","id","settings","upload_type","description","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 73 postgres
SELECT "description","user_id","name","id","upload_type","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 74 postgres
SELECT "name","settings","description","upload_type","user_id","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 76 postgres
SELECT "id","name","settings","upload_type","description","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 75 postgres
SELECT "user_id","id","description","settings","name","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 72 postgres
SELECT "settings","description","user_id","upload_type","id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 72 postgres
SELECT "upload_type","settings","name","description","id","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 72 postgres
SELECT "settings","upload_type","id","user_id","description","name" FROM "configuration" WHERE "user_id"=$1

Details
CREATE INDEX CONCURRENTLY ON upload (created_at)
Rows: 15354502
Row progression: 15354502, 1535450

Row estimates
- created_at (>): 1535450
- created_at (<): 1535450
- email (null): 3459881

Existing indexes
- id PRIMARY
- id WHERE config IS NOT NULL
- task_id
- task_id
- user_id, created_at
- user_id, created_at DESC

to speed up

Total Time Average Time Calls
442 min 51% 250,135 ms 106 postgres
SELECT config AS config
        FROM upload
        WHERE email IS NULL AND created_at < NOW() - INTERVAL $1
        AND created_at > NOW() - INTERVAL $2

Slow Queries

Slow queries take 20 ms or more on average and have been called at least 100 times.

Explain queries to see where to add indexes.

Total Time Average Time Calls
442 min 51% 250,135 ms 106 postgres
SELECT config AS config
        FROM upload
        WHERE email IS NULL AND created_at < NOW() - INTERVAL $1
        AND created_at > NOW() - INTERVAL $2
Details
CREATE INDEX CONCURRENTLY ON upload (created_at)
Rows: 15354502
Row progression: 15354502, 1535450

Row estimates
- created_at (>): 1535450
- created_at (<): 1535450
- email (null): 3459881

Existing indexes
- id PRIMARY
- id WHERE config IS NOT NULL
- task_id
- task_id
- user_id, created_at
- user_id, created_at DESC
344 min 40% 10,611 ms 1,947 readonly_user
SELECT  json_build_object($6, json_build_object($7, COUNT(*) ) ) AS "root" FROM  (SELECT  $8  FROM  (SELECT  *  FROM "public"."upload"  WHERE ((("public"."upload"."status") = ANY(($2)::text[])) AND (EXISTS  (SELECT  $9  FROM "public"."user" AS "__be_0_user" WHERE (((("__be_0_user"."id") = ("public"."upload"."user_id")) AND ($10)) AND (($11) AND (((("__be_0_user"."email") IS NOT NULL) AND ((("__be_0_user"."email") <> (($3)::text)) AND ($12))) AND (((((("__be_0_user"."credit") > (($4)::integer)) AND ($13)) AND ($14)) OR ((((("__be_0_user"."recurring_credit") > (($5)::integer)) AND ($15)) AND ($16)) OR ($17))) AND ($18)))))     )))     ) AS "_root.base"      ) AS "_root"
7 min 0.8% 215 ms 1,973 readonly_user
SELECT  json_build_object($7, json_build_object($8, COUNT(*) ) ) AS "root" FROM  (SELECT  $9  FROM  (SELECT  *  FROM "public"."upload"  WHERE ((("public"."upload"."status") = ANY(($2)::text[])) AND ((("public"."upload"."created_at") >= (($3)::timestamptz)) AND (EXISTS  (SELECT  $10  FROM "public"."user" AS "__be_0_user" WHERE (((("__be_0_user"."id") = ("public"."upload"."user_id")) AND ($11)) AND (($12) AND (((("__be_0_user"."email") IS NOT NULL) AND ((("__be_0_user"."email") <> (($4)::text)) AND ($13))) AND (((((("__be_0_user"."credit") > (($5)::integer)) AND ($14)) AND ($15)) OR ((((("__be_0_user"."recurring_credit") > (($6)::integer)) AND ($16)) AND ($17)) OR ($18))) AND ($19)))))     ))))     ) AS "_root.base"      ) AS "_root"
5 min 0.6% 1,216 ms 236 readonly_user
SELECT  json_build_object($5, json_build_object($6, COUNT(*) ) ) AS "root" FROM  (SELECT  $7  FROM  (SELECT  *  FROM "public"."upload"  WHERE (((("public"."upload"."created_at") < (($2)::timestamptz)) AND (("public"."upload"."created_at") >= (($3)::timestamptz))) AND (("public"."upload"."source") ILIKE (($4)::text)))     ) AS "_root.base"      ) AS "_root"
3 min 0.3% 1,157 ms 139 postgres
DELETE FROM "user" WHERE "id"=$1
Covered by index on (id)
Rows: 1504177
Row progression: 1504177, 1

Row estimates
- id (=): 1

Existing indexes
- id PRIMARY
- auth_id
- email
2 min 0.3% 1,068 ms 139 admin
DELETE FROM ONLY "public"."files" WHERE $1 OPERATOR(pg_catalog.=) "user_id"
1 min 0.2% 117 ms 770 postgres
SELECT
            stats.key AS key,
            SUM((stats.value)::numeric) AS total
        FROM upload u
        CROSS JOIN LATERAL jsonb_each(COALESCE(u.config->$4, $5::jsonb)) AS stats(key, value)
        WHERE u.user_id = $1
          AND u.status = $6
          AND u.created_at >= $2
          AND u.created_at < $3
          AND jsonb_typeof(stats.value) = $7
        GROUP BY stats.key
0 min < 0.1% 73 ms 198 postgres
SELECT "id" "id","source" "source","config" "config","created_at" "created_at","length_audio" "length_audio" FROM "upload" WHERE "user_id"=$1 AND "status"=$2 AND "created_at">=$3 AND "created_at"<$4 AND "created_at"<$5 ORDER BY "created_at" DESC LIMIT $6
Covered by index on (user_id, created_at)
Rows: 15354502
Row progression: 15354502, 1016, 102

Row estimates
- user_id (=): 1016
- created_at (>=): 1535450
- created_at (<): 1535450
- status (=): 3070900
- created_at (sort): 1

Existing indexes
- id PRIMARY
- id WHERE config IS NOT NULL
- task_id
- task_id
- user_id, created_at
- user_id, created_at DESC
0 min < 0.1% 60 ms 139 admin
DELETE FROM ONLY "public"."configuration" WHERE $1 OPERATOR(pg_catalog.=) "user_id"
0 min < 0.1% 64 ms 105 postgres
WITH query_stats AS ( SELECT LEFT(query, $1) AS query, queryid AS query_hash, rolname AS user, ((total_plan_time + total_exec_time) / $2 / $3) AS total_minutes, ((total_plan_time + total_exec_time) / calls) AS average_time, calls FROM pg_stat_statements INNER JOIN pg_database ON pg_database.oid = pg_stat_statements.dbid INNER JOIN pg_roles ON pg_roles.oid = pg_stat_statements.userid WHERE calls > $4 AND pg_database.datname = current_database() ) SELECT query, query AS explainable_query, query_hash, query_stats.user, total_minutes, average_time, calls, total_minutes * $5 / (SELECT SUM(total_minutes) FROM query_stats) AS total_percent, (SELECT SUM(total_minutes) FROM query_stats) AS all_queries_total_minutes FROM query_stats ORDER BY "total_minutes" DESC LIMIT $6 /*pghero*/
0 min < 0.1% 60 ms 112 postgres
SELECT "upload_type","name","description","user_id","id","settings" FROM "configuration" WHERE "user_id"=$1
Details
CREATE INDEX CONCURRENTLY ON configuration (user_id)
Rows: 99783
Row progression: 99783, 2

Row estimates
- user_id (=): 2

Existing indexes
- id PRIMARY
0 min < 0.1% 60 ms 109 postgres
SELECT "upload_type","user_id","id","description","settings","name" FROM "configuration" WHERE "user_id"=$1
Details
CREATE INDEX CONCURRENTLY ON configuration (user_id)
Rows: 99783
Row progression: 99783, 2

Row estimates
- user_id (=): 2

Existing indexes
- id PRIMARY
0 min < 0.1% 58 ms 110 postgres
SELECT "settings","user_id","id","name","description","upload_type" FROM "configuration" WHERE "user_id"=$1
Details
CREATE INDEX CONCURRENTLY ON configuration (user_id)
Rows: 99783
Row progression: 99783, 2

Row estimates
- user_id (=): 2

Existing indexes
- id PRIMARY
0 min < 0.1% 60 ms 103 postgres
SELECT "name","user_id","settings","upload_type","id","description" FROM "configuration" WHERE "user_id"=$1
Details
CREATE INDEX CONCURRENTLY ON configuration (user_id)
Rows: 99783
Row progression: 99783, 2

Row estimates
- user_id (=): 2

Existing indexes
- id PRIMARY
0 min < 0.1% 60 ms 102 postgres
SELECT "description","id","name","user_id","upload_type","settings" FROM "configuration" WHERE "user_id"=$1
Details
CREATE INDEX CONCURRENTLY ON configuration (user_id)
Rows: 99783
Row progression: 99783, 2

Row estimates
- user_id (=): 2

Existing indexes
- id PRIMARY
0 min < 0.1% 59 ms 101 postgres
SELECT "upload_type","settings","user_id","id","description","name" FROM "configuration" WHERE "user_id"=$1
Details
CREATE INDEX CONCURRENTLY ON configuration (user_id)
Rows: 99783
Row progression: 99783, 2

Row estimates
- user_id (=): 2

Existing indexes
- id PRIMARY