PostgreSQL: How to index all foreign keys?

前端 未结 3 884
南旧
南旧 2021-01-31 05:56

I am working with a large PostgreSQL database, and I am trying to tune it to get more performance.

Our queries and updates seem to be doing a lot of lookups using fore

3条回答
  •  离开以前
    2021-01-31 06:24

    The information is inside the catalog tables. But it seem it's not very straightforward to do want you need, specially if there are already some indexes created (and what about multicolumn indexes...)

    If you don't have any indexed FK , you could do something quick and dirty, as

     SELECT 'CREATE INDEX ' || table_name || '_' || column_name || '_idx ON '
       || table_name || '(' || column_name || ');'
    from foreign_key_tables where schema = 'public';
    

    You'd replace with the schema you are interested, dump that to a file, edit, check, pray and feed to psql. BEWARE this procedure does not detect already existant indexes.

    Ah, foreign_key_tables is an informational view created as:

    CREATE VIEW foreign_key_tables AS SELECT
        n.nspname AS schema,
        cl.relname AS table_name,
        a.attname AS column_name,
        ct.conname AS key_name,
        nf.nspname AS foreign_schema,
        clf.relname AS foreign_table_name,
        af.attname AS foreign_column_name,
        pg_get_constraintdef(ct.oid) AS create_sql
    FROM pg_catalog.pg_attribute a
    JOIN pg_catalog.pg_class cl ON (a.attrelid = cl.oid AND cl.relkind =
    'r')
    JOIN pg_catalog.pg_namespace n ON (n.oid = cl.relnamespace)
    JOIN pg_catalog.pg_constraint ct ON (a.attrelid = ct.conrelid AND
    ct.confrelid != 0 AND ct.conkey[1] = a.attnum)
    JOIN pg_catalog.pg_class clf ON (ct.confrelid = clf.oid AND clf.relkind
    = 'r')
    JOIN pg_catalog.pg_namespace nf ON (nf.oid = clf.relnamespace)
    JOIN pg_catalog.pg_attribute af ON (af.attrelid = ct.confrelid AND
    af.attnum = ct.confkey[1]);
    

提交回复
热议问题