PgHero
No long running queries
Connections healthy 10
Vacuuming healthy
No columns near integer overflow
No invalid indexes or constraints
8 duplicate indexes
No suggested indexes
1 slow query

Duplicate Indexes

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

rails generate migration remove_unneeded_indexes

And paste

remove_index :accounts, name: "ix_accounts_user_id", column: :user_id
remove_index :bonus_accruals, name: "ix_bonus_accruals_account_id", column: :account_id
remove_index :deposit_addresses, name: "ix_deposit_addresses_user_id", column: :user_id
remove_index :email_otp_challenges, name: "ix_email_otp_challenges_user_id", column: :user_id
remove_index :interest_accruals, name: "ix_interest_accruals_account_id", column: :account_id
remove_index :ledger_entries, name: "ix_ledger_entries_account_id", column: :account_id
remove_index :user_devices, name: "ix_user_devices_user_id", column: :user_id
remove_index :users, name: "ix_users_email", column: :email
Details
On accounts
ix_accounts_user_id (user_id)
is covered by
uq_accounts_user_type (user_id, account_type)
On bonus_accruals
ix_bonus_accruals_account_id (account_id)
is covered by
uq_bonus_account_campaign (account_id, campaign_code)
On deposit_addresses
ix_deposit_addresses_user_id (user_id)
is covered by
uq_deposit_addresses_user_provider_network (user_id, provider_id, network)
On email_otp_challenges
ix_email_otp_challenges_user_id (user_id)
is covered by
ix_email_otp_challenges_user_purpose (user_id, purpose)
On interest_accruals
ix_interest_accruals_account_id (account_id)
is covered by
uq_interest_account_period (account_id, period_date)
On ledger_entries
ix_ledger_entries_account_id (account_id)
is covered by
ix_ledger_entries_account_created (account_id, created_at)
On user_devices
ix_user_devices_user_id (user_id)
is covered by
uq_user_devices_user_fp (user_id, fingerprint_hash)
On users
ix_users_email (email)
is covered by
uq_users_email (email)

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
0 min 57% 35 ms 509 taleon
SELECT schemaname AS schema, t.relname AS table, ix.relname AS name, regexp_replace(pg_get_indexdef(i.indexrelid), $1, $2) AS columns, regexp_replace(pg_get_indexdef(i.indexrelid), $3, $4) AS using, indisunique AS unique, indisprimary AS primary, indisvalid AS valid, indexprs::text, indpred::text, pg_get_indexdef(i.indexrelid) AS definition FROM pg_index i INNER JOIN pg_class t ON t.oid = i.indrelid INNER JOIN pg_class ix ON ix.oid = i.indexrelid LEFT JOIN pg_stat_user_indexes ui ON ui.indexrelid = i.indexrelid WHERE schemaname IS NOT NULL ORDER BY 1, 2 /*application='PgHero'*/