/* Look for foreign key constraints that are missing indexes on the referencing table. Orders results by the size of the referencing table, largest first, on the assumption that, all else being equal, they are the most likely to benefit from the addition of indexes. This is only meant as a starting point, and isn't perfect. It's possible, for example, that it will report a missing index when in fact one is available. e.g., it won't realize that an index on (f1, f2) could be used with a fk on (f1). However, it will recognize that an index on (f1, f2) can be used with a fk on (f2, f1). Usage: psql -q dbname -f pg-find-missing-fk-indexes.sql */ CREATE FUNCTION pg_temp.sortarray(int2[]) returns int2[] as ' SELECT ARRAY( SELECT $1[i] FROM generate_series(array_lower($1, 1), array_upper($1, 1)) i ORDER BY 1 ) ' language sql; SELECT conrelid::regclass ,conname ,reltuples::bigint FROM pg_constraint JOIN pg_class ON (conrelid = pg_class.oid) WHERE contype = 'f' AND NOT EXISTS ( SELECT 1 FROM pg_index WHERE indrelid = conrelid AND pg_temp.sortarray(conkey) = pg_temp.sortarray(indkey) ) ORDER BY reltuples DESC ;
Wednesday, August 5, 2009
Postgresql: Indexes on Foreign Keys
This query identifies foreign keys that are potentially missing indexes (Postgresql does not create indexes on foreign keys automatically).
Subscribe to:
Post Comments (Atom)
5 comments:
Thank you a lot! I could find all missing indexes for foreign keys in my database thanks to your query!
You can replace your temp function condition by this one :
AND (conkey::int[] <@ indkey::int[]) and (conkey::int[] @> indkey::int[])
Using the symetrical inclusion to verify the egality of the 2 arrays.
And with a lighter condition you can treat the cases of columns of FK included in an index covering more columns :
AND (conkey::int[] <@ indkey::int[])
Is it possible for this query to return the names of the columns in the foreign key relationship as well?
Thanks ffor this blog post
Post a Comment