Skip to content

Instantly share code, notes, and snippets.

@brunovcosta
Last active June 3, 2020 14:22
Show Gist options
  • Save brunovcosta/b3840f1bd168164529d77caf0cae4f6e to your computer and use it in GitHub Desktop.
Save brunovcosta/b3840f1bd168164529d77caf0cae4f6e to your computer and use it in GitHub Desktop.
Fix all missing indexes in PostgreSQL
-- source: https://www.cybertec-postgresql.com/en/index-your-foreign-key/
WITH missing_indexes AS (
SELECT c.conrelid::regclass AS "table",
/* list of key column names in order */
string_agg(a.attname, ',' ORDER BY x.n) AS columns,
pg_catalog.pg_size_pretty(
pg_catalog.pg_relation_size(c.conrelid)
) AS size,
c.conname AS constraint,
c.confrelid::regclass AS referenced_table
FROM pg_catalog.pg_constraint c
/* enumerated key column numbers per foreign key */
CROSS JOIN LATERAL
unnest(c.conkey) WITH ORDINALITY AS x(attnum, n)
/* name for each key column */
JOIN pg_catalog.pg_attribute a
ON a.attnum = x.attnum
AND a.attrelid = c.conrelid
WHERE NOT EXISTS
/* is there a matching index for the constraint? */
(SELECT 1 FROM pg_catalog.pg_index i
WHERE i.indrelid = c.conrelid
/* the first index columns must be the same as the
key columns, but order doesn't matter */
AND (i.indkey::smallint[])[0:cardinality(c.conkey)-1]
@> c.conkey)
AND c.contype = 'f'
GROUP BY c.conrelid, c.conname, c.confrelid
ORDER BY pg_catalog.pg_relation_size(c.conrelid) DESC
) SELECT
'CREATE INDEX '||"table"||'_'||columns||' ON '||"table"||'('||columns||');'
FROM missing_indexes
WHERE "table"::varchar NOT IN ('hdb_catalog.event_triggers')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment