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

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 102 postgres
SELECT "description","id","name","user_id","upload_type","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 102 postgres
SELECT "name","user_id","settings","upload_type","id","description" 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% 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 96 postgres
SELECT "description","id","upload_type","user_id","settings","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 96 postgres
SELECT "name","description","settings","id","user_id","upload_type" 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% 59 ms 94 postgres
SELECT "description","settings","name","upload_type","user_id","id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 95 postgres
SELECT "id","upload_type","settings","description","user_id","name" 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% 61 ms 89 postgres
SELECT "settings","id","name","upload_type","description","user_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 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% 58 ms 91 postgres
SELECT "upload_type","settings","name","description","user_id","id" 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% 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 "description","upload_type","id","name","user_id","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 82 postgres
SELECT "id","upload_type","name","description","user_id","settings" 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% 58 ms 85 postgres
SELECT "name","settings","upload_type","user_id","id","description" 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% 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% 60 ms 80 postgres
SELECT "upload_type","id","settings","name","description","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 60 ms 79 postgres
SELECT "user_id","description","upload_type","id","name","settings" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 58 ms 82 postgres
SELECT "id","upload_type","description","user_id","name","settings" 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% 59 ms 80 postgres
SELECT "description","user_id","name","id","settings","upload_type" 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% 60 ms 77 postgres
SELECT "upload_type","settings","user_id","name","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% 61 ms 76 postgres
SELECT "user_id","settings","name","id","description","upload_type" 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% 60 ms 76 postgres
SELECT "name","id","user_id","upload_type","description","settings" 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% 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 "settings","id","description","name","upload_type","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 61 ms 73 postgres
SELECT "id","description","name","upload_type","settings","user_id" 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 "id","user_id","settings","description","name","upload_type" 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% 61 ms 71 postgres
SELECT "user_id","upload_type","description","settings","id","name" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 72 postgres
SELECT "description","name","settings","upload_type","id","user_id" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 72 postgres
SELECT "upload_type","id","settings","user_id","name","description" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 62 ms 69 postgres
SELECT "settings","user_id","description","id","name","upload_type" FROM "configuration" WHERE "user_id"=$1
0 min < 0.1% 59 ms 72 postgres
SELECT "name","id","settings","user_id","upload_type","description" 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
438 min 51% 250,022 ms 105 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
438 min 51% 250,022 ms 105 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
340 min 40% 10,616 ms 1,922 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,948 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 136 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,067 ms 136 admin
DELETE FROM ONLY "public"."files" WHERE $1 OPERATOR(pg_catalog.=) "user_id"
1 min 0.2% 118 ms 763 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 136 admin
DELETE FROM ONLY "public"."configuration" WHERE $1 OPERATOR(pg_catalog.=) "user_id"
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 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% 60 ms 102 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% 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